3

可能重复:
Python:为什么是(“hello”是“hello”)?

['hello'] is ['hello']    # gives False

为什么?他们的身份证不一样。为什么元组或数字最终没有返回 False?

4

3 回答 3

11

考虑以下(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

ab是两个不同的对象。您可以通过以下方式检查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']

因为ab是指同一个对象的名称 ( id(a) == id(b))。最后,表明即使你得到

>>> a = ["Hello"]
>>> b = ["Hello"]
>>> a is b
False

字符串仍被保留并仅存储一次:

>>> id(a[0])
33846096L
>>> id(b[0])
33846096L
于 2012-10-09T07:26:43.337 回答
8

运算符测试两个is对象引用是否引用同一个对象(它不是一个相等运算符,而是一个恒等运算符)。在您的示例中,您创建了两个单独的列表,因此您有两个不同的对象,这就是您看到False被返回的原因。

于 2012-10-09T07:08:44.880 回答
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
于 2012-10-09T07:21:46.587 回答