Python 为什么不';TF字符串在其引用的变量更改时更改?
在最近的Python 3.6版本中使用新的f字符串时,我注意到以下几点: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
foo
变量,其值为bar
:
>>> foo = 'bar'
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
属性吗?@hpauljtype(baz)
会告诉你;普通字符串。您希望表达式'Hanging in'+foo
的行为如何?或者'Hanging in{}。format(foo)
-它们不保留对插值的引用。据我所知,这些花哨的“f字符串”只是str.format
@JoshLee的某种语法糖。更好的问题是它们期望foo=f'{foo}'
的行为如何。
In [4]: type(baz)
Out[4]: str