为什么字符串变量在更改时不更新
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
,其中 %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
字符串是不可变的,无法更改,但您尝试做的事情也不适用于可变对象,因此可变性(或缺乏可变性)在这里是一个转移注意力的问题。
真正的原因是 Python 不像 Excel 那样工作。对象不会记住对它们执行的所有操作,然后在您更改进入它们的任何信息时重新执行这些操作。要使 Python 以这种方式工作,该语言需要保留每个对象曾经处于的每个状态,或者曾经对它们执行的所有操作及其参数。两者都会使您的程序使用更多内存并且 运行 更慢。除此之外,假设您在另一个表达式中使用了 string1
:该值也需要更新。在Python3中,print()
是一个函数;当打印的变量改变时是否需要再次调用?
有些语言在某种程度上是这样工作的,但 Python 不是其中之一。除非您以其他方式明确安排事情(通过编写和调用函数),Python 会计算一次表达式并继续使用该精确结果。
事实上,您想要的在Python中甚至是不可能的。当您执行字符串插值(%
操作)时,执行它的代码只会看到您插值的值。它不知道 "6"
来自一个名为 placehold
的变量。因此,即使它想更改字符串,也无法稍后更改,因为它无法知道 placehold
和 string1
之间存在任何关系。 (此外,考虑到您不需要插入单个变量:它可以是一个表达式,例如 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 需要在相同的功能或在全球范围内)。此外,如果您在与另一个字符串的操作中使用这个特殊字符串,比如连接,它几乎肯定会不再是特殊字符串。解决这些问题是可能的,但是......毛茸茸的。不推荐。
假设我们有这样的代码:
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
,其中 %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
字符串是不可变的,无法更改,但您尝试做的事情也不适用于可变对象,因此可变性(或缺乏可变性)在这里是一个转移注意力的问题。
真正的原因是 Python 不像 Excel 那样工作。对象不会记住对它们执行的所有操作,然后在您更改进入它们的任何信息时重新执行这些操作。要使 Python 以这种方式工作,该语言需要保留每个对象曾经处于的每个状态,或者曾经对它们执行的所有操作及其参数。两者都会使您的程序使用更多内存并且 运行 更慢。除此之外,假设您在另一个表达式中使用了 string1
:该值也需要更新。在Python3中,print()
是一个函数;当打印的变量改变时是否需要再次调用?
有些语言在某种程度上是这样工作的,但 Python 不是其中之一。除非您以其他方式明确安排事情(通过编写和调用函数),Python 会计算一次表达式并继续使用该精确结果。
事实上,您想要的在Python中甚至是不可能的。当您执行字符串插值(%
操作)时,执行它的代码只会看到您插值的值。它不知道 "6"
来自一个名为 placehold
的变量。因此,即使它想更改字符串,也无法稍后更改,因为它无法知道 placehold
和 string1
之间存在任何关系。 (此外,考虑到您不需要插入单个变量:它可以是一个表达式,例如 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 需要在相同的功能或在全球范围内)。此外,如果您在与另一个字符串的操作中使用这个特殊字符串,比如连接,它几乎肯定会不再是特殊字符串。解决这些问题是可能的,但是......毛茸茸的。不推荐。