['hello'] is ['hello'] # gives False
为什么呢?他们的ids不同。为什么一个元组或一个数字最终没有返回False?
答案 0 :(得分:10)
考虑以下内容(Python 2.7.3,64bit):
>>> 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
这是一件好事 TM ,因为当你做
时>>> 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
答案 1 :(得分:8)
is
运算符测试两个对象引用是否引用同一个对象(它不是相等运算符,而是一个标识运算符)。在您的示例中,您创建了两个单独的列表,因此您有两个不同的对象,这就是您看到False
被返回的原因。
答案 2 :(得分:1)
使用[]
语法创建列表时,会创建一个新的列表对象。列表是可变对象,因此,即使两个列表恰好包含相同的元素,它们也不是相同的对象。您可以观察到,通过调用其中一个修改方法来更改列表确实不会更改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