为什么['hello']在Python中的['hello']返回False?

时间:2012-10-09 07:05:36

标签: python

  

可能重复:
  Python: Why is (“hello” is “hello”)?

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

为什么呢?他们的ids不同。为什么一个元组或一个数字最终没有返回False?

3 个答案:

答案 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

ab是两个不同的对象。您可以使用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']

因为ab是引用同一对象(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