为什么字符串变量在更改时不更新

Why don't string variables update when they are changed

假设我们有这样的代码:

placehold = "6"
string1 = "this is string one and %s" % placehold

print string1

placehold = "7"
print string1

当 运行 时,两个打印语句 return 就像占位符一样总是 6。但是,就在第二个语句 运行 之前,占位符被更改为 7,所以为什么它不会动态反映在字符串中吗?

此外,您能否建议一种将字符串 return 设为 7 的方法?

谢谢

string1 将使用 placehold 在声明 string1 时存在的任何值。在您的示例中,该值恰好是 "6"。要将 string1 变为 "return with 7",您需要在更改 placehold.

的值后重新分配它 (string1 = "this is string one and %s" % placehold)

因为你已经在执行该语句后为该变量赋值了。

听起来您更愿意需要这样的函数:

def f(placehold):
    return "this is string one and %s" % placehold

现在您可以print(f("7"))实现所需的功能。

当你这样做时:

string1 = "this is string one and %s" % placehold

您正在创建一个字符串 string1,其中 %splacehold 的值替换 在稍后更改 placehold 的值时,它不会对string1 因为字符串不包含变量的动态 属性。为了反映更改值的字符串,您必须再次重新分配字符串。

或者,您可以使用 .format() 作为:

string1 = "this is string one and {}"
placeholder = 6
print string1.format(placeholder)
# prints: this is string one and 6

placeholder = 7
print string1.format(placeholder)
# prints: this is string one and 7

字符串是不可变的,无法更改,但您尝试做的事情也不适用于可变对象,因此可变性(或缺乏可变性)在这里是一个转移注意力的问题。

真正的原因是 Python 不像 Excel 那样工作。对象不会记住对它们执行的所有操作,然后在您更改进入它们的任何信息时重新执行这些操作。要使 Python 以这种方式工作,该语言需要保留每个对象曾经处于的每个状态,或者曾经对它们执行的所有操作及其参数。两者都会使您的程序使用更多内存并且 运行 更慢。除此之外,假设您在另一个表达式中使用了 string1:该值也需要更新。在Python3中,print()是一个函数;当打印的变量改变时是否需要再次调用?

有些语言在某种程度上是这样工作的,但 Python 不是其中之一。除非您以其他方式明确安排事情(通过编写和调用函数),Python 会计算一次表达式并继续使用该精确结果。

事实上,您想要的在Python中甚至是不可能的。当您执行字符串插值(% 操作)时,执行它的代码只会看到您插值的值。它不知道 "6" 来自一个名为 placehold 的变量。因此,即使它想更改字符串,也无法稍后更改,因为它无法知道 placeholdstring1 之间存在任何关系。 (此外,考虑到您不需要插入单个变量:它可以是一个表达式,例如 placehold + "0"。因此 Python 需要记住整个表达式,而不仅仅是变量名,以重新-稍后再评估。)

您可以编写自己的字符串 subclass 来提供您想要的特定行为:

class UpdatingString(str):
    def __str__(self):
        return self % placehold

placehold = "6"
string1 = UpdatingString("this is string one and %s")
print(string1)
placehold = "7"
print(string1)

但这充满了作用域问题(基本上,class 需要能够看到 placehold,这意味着变量和 class 需要在相同的功能或在全球范围内)。此外,如果您在与另一个字符串的操作中使用这个特殊字符串,比如连接,它几乎肯定会不再是特殊字符串。解决这些问题是可能的,但是......毛茸茸的。不推荐。