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

Max*_*nar 9 python python-3.x python-3.6 f-string

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

  1. 我们创建一个foo值为的变量bar:

    >>> foo = 'bar'
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后,我们声明一个新变量,它是我们的f-string,它应该foo被格式化:

    >>> baz = f'Hanging on in {foo}'
    
    Run Code Online (Sandbox Code Playgroud)
  3. 好的,一切正常,然后我们打电话baz来检查它的价值:

    >>> baz
    'Hanging on in bar'
    
    Run Code Online (Sandbox Code Playgroud)
  4. 让我们尝试更改值foobaz再次调用:

    >>> foo = 'spam'
    >>> baz
    'Hanging on in bar'
    
    Run Code Online (Sandbox Code Playgroud)

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

Jim*_*ard 13

f-string,当你执行了评估:

>>> baz = f'Hanging on in {foo}'
Run Code Online (Sandbox Code Playgroud)

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

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

>>> type(f'hanging on in {foo}')
<class 'str'>
Run Code Online (Sandbox Code Playgroud)

仅供参考,请参见上一节格式化字符串字面量:

[..]虽然其他字符串文字总是具有常量值,但格式化字符串实际上是在运行时计算的表达式.[..]

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

  • @hpaulj`type(baz)`会告诉你; 普通字符串. (5认同)