python – 为什么f-strings在它们引用的变量发生变化时不会改变?

在最近的Python 3.6版本中使用新的f字符串时,我注意到以下内容:

>我们使用值栏创建一个foo变量:

>>> foo = 'bar'

>然后,我们声明一个新变量,它是我们的f-string,它应该采用foo格式化:

>>> baz = f'Hanging on in {foo}'

>好的,一切顺利,然后我们打电话给巴兹检查它的价值:

>>> baz
'Hanging on in bar'

>让我们尝试改变foo的值并再次调用baz:

>>> foo = 'spam'
>>> baz
'Hanging on in bar'

它不应该是动态的吗?为什么会这样?我认为如果foo的值发生了变化,f字符串会更新,但这并没有发生.我不明白这是如何工作的.

最佳答案
执行时已经评估了f-string:

>>> baz = f'Hanging on in {foo}'

具体来说,它查找了名称foo的值,并将其替换为’bar’,即为其找到的值.然后baz在格式化后包含字符串.

f弦不是常数;意思是,在评估之后,他们内部没有替换字段等待评估.它们会在您执行它们时进行评估,之后,分配的值只是一个普通的字符串:

>>> type(f'hanging on in {foo}')
<class 'str'>

供参考,请参见the section on Formatted String Literals

[..] While other string literals always have a constant value, formatted strings are really expressions evaluated at run time. [..]

在执行表达式(替换字段的查找及其后续格式化)之后,对它们没有什么特别之处,表达式已经被计算为字符串并分配给baz.

转载注明原文:python – 为什么f-strings在它们引用的变量发生变化时不会改变? - 代码日志