Python 元组中的不变性列表 - 对象还是值?

Python Immutability List in Tuple - Object or Value?

谁能帮我理解为什么 z 和 c 变量之间的第二次比较结果为 False?

t = [1, 2, 3]
h = t
print(id(h), " ", id(t))
print(h is t)

x = ('bla', t)
y = ('bla', t)

z, c = str(x[1]), str(y[1])

print(id(z), " ", id(c))
print(z is c)

我的初步印象是 x[1] 和 y[1] 将指向相同的引用,因为我们直接将元组的索引分配给 t 变量。这是否意味着 Python 传递的是 t 的值而不是变量的对象?为什么 h is t 的计算结果为 True 而 z is c 的计算结果为 false? *** 挠头 ***

这与元组本身无关,但是 str 基本上应用于任何还不是字符串的东西(除非 class 重新定义其 __str__ 方法来缓存结果):

x = 0

x is x
# True

str(x) is str(x)
# => False

这是因为str(x)每次都将其参数转换为新的字符串。

因此,您示例中的 zc 不同的 个字符串,但恰好具有相同的内容 ('[1, 2, 3]')。

字符串的不变性是让相同的字符串共享同一对象的必要条件,但不是充分条件。查找字符串以查看它是否已经存在会产生一些开销,因此大多数时候 Python 不会打扰。它确实为 interned strings 提供了便利,因此您可以根据需要自行完成。

>>> import sys
>>> str(0) is str(0)
False
>>> sys.intern(str(0)) is sys.intern(str(0))
True