['hello'] is ['hello'] # gives False
为什么?他们的身份证不一样。为什么元组或数字最终没有返回 False?
['hello'] is ['hello'] # gives False
为什么?他们的身份证不一样。为什么元组或数字最终没有返回 False?
考虑以下(Python 2.7.3,64 位):
>>> a = "Hello"
>>> b = "Hello"
>>> a is b
True
Python 对短字符串进行实习'Hello'
,只存储一次。这是一个实现细节,语言标准不保证。它可能会在较长的字符串上失败:
>>> a = "this is a long string"
>>> b = "this is a long string"
>>> a is b
False
现在考虑一下:
>>> a = ["Hello"]
>>> b = ["Hello"]
>>> a is b
False
a
和b
是两个不同的对象。您可以通过以下方式检查id()
:
>>> id(a)
33826696L
>>> id(b)
33826952L
这是一件好事,因为当你这样做时
>>> a[0] = "Goodbye"
>>> a
['Goodbye']
>>> b
['Hello']
但是,如果你这样做
>>> a = ["Hello"]
>>> b = a
>>> a is b
True
>>> a[0] = "Goodbye"
>>> b
['Goodbye']
因为a
和b
是指同一个对象的名称 ( id(a) == id(b)
)。最后,表明即使你得到
>>> a = ["Hello"]
>>> b = ["Hello"]
>>> a is b
False
字符串仍被保留并仅存储一次:
>>> id(a[0])
33846096L
>>> id(b[0])
33846096L
运算符测试两个is
对象引用是否引用同一个对象(它不是一个相等运算符,而是一个恒等运算符)。在您的示例中,您创建了两个单独的列表,因此您有两个不同的对象,这就是您看到False
被返回的原因。
当您使用[]
语法创建列表时,会创建一个新的列表对象。列表是可变对象,因此,即使两个列表碰巧包含相同的元素,它们也不是相同的对象。您可以观察到通过调用其中一种修改方法来更改列表实际上不会更改 ID:
In [1]: a = ["hello"]
In [2]: b = ["hello"]
In [3]: id(a)
Out[3]: 4477468112
In [4]: id(b)
Out[4]: 4477467824
In [5]: a.append("world")
In [6]: id(a)
Out[6]: 4477468112