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

时间:2016-10-02 14:58:07

标签: python string python-2.7 string-formatting

假设我们有一些像这样的代码:

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

print string1

placehold = "7"
print string1

当运行时,两个print语句都返回,就好像placehold总是6个。但是,就在第二个语句运行之前,placehold被更改为7,那为什么它不会动态地反映在字符串中呢?

另外,你能建议一种方法让字符串返回7吗?

谢谢

4 个答案:

答案 0 :(得分:4)

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

听起来你需要一个像以下这样的功能:

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

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

答案 1 :(得分:3)

当你这样做时:

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

您正在创建一个字符串string1,其中%s替换为placehold的值。稍后更改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 用作:

srcset

答案 2 :(得分:2)

字符串是不可变的并且无法更改,但是您尝试做的事情也不能与可变对象一起使用,因此可变性(或缺少它)是一种红色的鲱鱼这里。

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

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

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

您可以编写自己的字符串子类以提供所需的特定行为:

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)

但这充满了范围问题(基本上,类需要能够看到placehold,这意味着变量和类需要在同一函数或全局范围内定义)。另外,如果你在一个带有另一个字符串的操作中使用这个特殊字符串,比如连接,它几乎肯定会停止特殊。解决这些问题是可能的,但是......毛茸茸的。我不推荐它。

答案 3 :(得分:1)

string1将使用宣布placehold时存在的string1值。在您的示例中,该值恰好是"6"。要让string1“以7返回”,您需要在更改string1 = "this is string one and %s" % placehold的值后重新分配(placehold)。