当f字符串引用的变量更改时,为什么不更改?


问题内容

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

  1. 我们创建一个foo带有值的变量bar

    >>> foo = 'bar'
    
  2. 然后,我们声明一个新变量,它是我们的f字符串,应将foo其格式化:

    >>> baz = f'Hanging on in {foo}'
    
  3. 一切正常,然后我们调用baz以检查其值:

    >>> baz
    

    ‘Hanging on in bar’

  4. 让我们尝试更改的值,foo然后baz再次调用:

    >>> foo = 'spam'
    

    baz
    ‘Hanging on in bar’

它不应该是动态的吗?为什么会这样?我以为如果foo更改value,f字符串会更新,但这没有发生。我不明白这是怎么回事。


问题答案:

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

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

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

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

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

作为参考,请参见有关
格式化字符串文字

的部分

[..]虽然其他字符串文字始终具有恒定值,但是格式化的字符串实际上是 在运行时评估的表达式 。[..]

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