Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么不';TF字符串在其引用的变量更改时更改?_Python_Python 3.x_Python 3.6_F String - Fatal编程技术网

Python 为什么不';TF字符串在其引用的变量更改时更改?

Python 为什么不';TF字符串在其引用的变量更改时更改?,python,python-3.x,python-3.6,f-string,Python,Python 3.x,Python 3.6,F String,在最近的Python 3.6版本中使用新的f字符串时,我注意到以下几点: 我们创建一个foo变量,其值为bar: >>> foo = 'bar' 然后,我们声明一个新变量,它是我们的f字符串,它应该采用foo进行格式化: >>> baz = f'Hanging on in {foo}' 好的,一切正常,然后我们调用baz检查其值: >>> baz 'Hanging on in bar' 让我们尝试更改foo的值,然后再次调用baz

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

    在执行以下命令时,
    f-string
    已经过评估:

    >>> baz = f'Hanging on in {foo}'
    
    具体地说,它查找名称
    foo
    的值,并将其替换为
    “bar”
    ,即为其找到的值
    baz
    然后在格式化后包含字符串

    f-string
    s不是常数;也就是说,它们内部没有一个替换字段,在被评估后等待评估。它们在执行时进行计算,然后,分配的值只是一个普通字符串:

    >>类型(f'挂在{foo}'中)
    
    有关参考,请参阅:

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


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

    字符串是不可变的,一旦创建了字符串,就不能再对其进行更改

    foo
    和更重要的
    baz
    都是字符串。这意味着,当您创建它们时,它们将进入内存,并且无法再更改

    分配
    foo=bar
    后,您创建了此对象并将其分配到内存中的特定位置。对
    baz
    也做了同样的事情

    即使
    baz
    was作为a,也不意味着它不再是不变的,因为:

    In [4]: type(baz)
    Out[4]: str
    
    通过这样做,
    baz
    被创建为一个对象,并作为挂在bar上的
    分配给您的内存,因此它与
    foo
    的关系纯粹是在实例化过程中。在此期间,
    baz
    查找对象
    foo
    ,并在适当的地方将其连接起来


    创建
    foo='spam'
    后,您销毁了
    foo
    的原始赋值,并在内存中创建一个新赋值。

    创建后的
    baz
    是什么?普通字符串?或者它有一些特殊的
    f
    属性吗?@hpaulj
    type(baz)
    会告诉你;普通字符串。您希望表达式
    'Hanging in'+foo
    的行为如何?或者
    'Hanging in{}。format(foo)
    -它们不保留对插值的引用。据我所知,这些花哨的“f字符串”只是
    str.format
    @JoshLee的某种语法糖。更好的问题是它们期望
    foo=f'{foo}'
    的行为如何。
    In [4]: type(baz)
    Out[4]: str