假设我们有一些像这样的代码:
placehold = "6"
string1 = "this is string one and %s" % placehold
print string1
placehold = "7"
print string1
当运行时,两个print语句都返回,就好像placehold总是6个。但是,就在第二个语句运行之前,placehold被更改为7,那为什么它不会动态地反映在字符串中呢?
另外,你能建议一种方法让字符串返回7吗?
谢谢
答案 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
的变量。因此,即使它想要,也无法在以后更改字符串,因为它无法知道placehold
和string1
之间存在任何关系。 (另外,考虑到你不需要插入单个变量:它可能是一个表达式,如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
)。