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

标签 python python-3.x python-3.6 f-string

在最近发布的 Python 3.6 中使用新的 f 弦时,我注意到以下几点:

  1. 我们创建一个值为 barfoo 变量:

    >>> 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 的值发生变化,f 字符串会更新,但这并没有发生。我不明白这是怎么回事。

最佳答案

f-string 在您执行时已经被求值:

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

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

f-string 不是常量;这意味着,它们内部没有等待评估的替换字段after 被评估。 它们会在您执行它们时进行评估,之后,分配的值只是一个普通字符串:

>>> 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 在它们引用的变量发生变化时不发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41306928/

相关文章:

docker - 构建 Dockerfile 时出现错误,因为 pynacl 的构建轮失败

python - 根据特定行和列值的引用表填充数据框表中的 NaN 单元格

python - 持续监听TCP端口

python - 基于python3中的另一个值从字典列表中提取值

python - 如何在for循环中打开多个文本文件

python - 如何在 Python 中的局部变量中存储随机整数?

python - 跟踪方法 'u' 参数相当于trace_add?

Java:BufferedReader 从 Python 脚本和正则表达式实时读取 self 更新的 shell 输出,每 5 秒更新一次

python-3.x - 如何将 Turtle Canvas 保存为图像(.png 或 .jpg)

python - 在 python 中以递归方式对文件进行 glob 的干净方法