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)
每次都将其参数转换为新的字符串。
因此,您示例中的 z
和 c
是 不同的 个字符串,但恰好具有相同的内容 ('[1, 2, 3]'
)。
字符串的不变性是让相同的字符串共享同一对象的必要条件,但不是充分条件。查找字符串以查看它是否已经存在会产生一些开销,因此大多数时候 Python 不会打扰。它确实为 interned strings 提供了便利,因此您可以根据需要自行完成。
>>> import sys
>>> str(0) is str(0)
False
>>> sys.intern(str(0)) is sys.intern(str(0))
True
谁能帮我理解为什么 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)
每次都将其参数转换为新的字符串。
因此,您示例中的 z
和 c
是 不同的 个字符串,但恰好具有相同的内容 ('[1, 2, 3]'
)。
字符串的不变性是让相同的字符串共享同一对象的必要条件,但不是充分条件。查找字符串以查看它是否已经存在会产生一些开销,因此大多数时候 Python 不会打扰。它确实为 interned strings 提供了便利,因此您可以根据需要自行完成。
>>> import sys
>>> str(0) is str(0)
False
>>> sys.intern(str(0)) is sys.intern(str(0))
True