当f字符串引用的变量更改时,为什么不更改?
问题内容:
在最近的Python 3.6版本中使用新的f字符串时,我注意到以下几点:
-
我们创建一个
foo
带有值的变量bar
:>>> foo = 'bar'
-
然后,我们声明一个新变量,它是我们的f字符串,应将
foo
其格式化:>>> baz = f'Hanging on in {foo}'
-
一切正常,然后我们调用
baz
以检查其值:>>> baz
‘Hanging on in bar’
-
让我们尝试更改的值,
foo
然后baz
再次调用:>>> foo = 'spam'
baz
‘Hanging on in bar’
它不应该是动态的吗?为什么会这样?我以为如果foo
更改value,f字符串会更新,但这没有发生。我不明白这是怎么回事。
问题答案:
在f-string
已 已 ,当你执行了评估:
>>> baz = f'Hanging on in {foo}'
具体来说,它查找名称的值foo
并将其替换为找到的名称'bar'
。baz
然后在格式化后包含该字符串。
f-string
s不是恒定的;意思是,他们内部没有替换字段,待评估 后 等待评估。 它们在您执行它们时进行评估 ,之后,分配的值
只是一个普通字符串 :
>>> type(f'hanging on in {foo}')
<class 'str'>
作为参考,请参见有关
格式化字符串文字
的部分:
[..]虽然其他字符串文字始终具有恒定值,但是格式化的字符串实际上是 在运行时评估的表达式 。[..]
在执行表达式(查找替换字段及其后续格式)之后,它们没有什么特别的,表达式已被评估为字符串并分配给baz
。