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

为什么Python中的[';hello';]返回False?,python,Python,可能重复: 为什么??他们的身份证不同。为什么元组或数字没有返回False?is操作符测试两个对象引用是否引用同一个对象(它不是相等操作符,而是标识操作符)。在您的示例中,您创建了两个单独的列表,因此您有两个不同的对象,这就是为什么会返回False。使用[]语法创建列表时,会创建一个新的列表对象。列表是可变对象,因此,即使两个列表恰好包含相同的元素,它们也不是相同的对象。您可以观察到,通过调用列表的一个修改方法来更改列表实际上不会更改ID: In [1]: a = ["hello"] In [

可能重复:


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

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
考虑以下内容(Python 2.7.3,64位):

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()
检查这一点:

这是一件好事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

杰出的但是我如何保证这个名字指的是同一个对象呢?换句话说,我怎样才能确保我的对象处于优化状态?为什么Python不能意识到
['hello']
执行了两次?尝试将列表分配给变量,这可能会让事情更清楚:l=['hello']l是l将返回True,l=['hello']m=['hello']l是m如果执行
a=['hello']操作,则将返回false;b=['hello']
a是b
将为False,因为它是两个不同的对象。毕竟,你不希望
a[0]=“再见”
影响
b
,是吗?如果你做
a=['hello'];b=a
,然而,
a是b
将是真的,
a[0]=“再见”
也将影响
b
。@TimPietzcker那么可变obejct是否会导致Python不优化它(作为策略决定)?没有什么需要优化的-您有两个不同的独立对象。字符串
'hello'
通过interning进行优化,因此它只存储一次。但是您的
is
比较不会比较字符串,而是比较列表<代码>“对于不可变对象,例如字符串,不同的变量实际上会引用同一个对象”,这是不正确的。请看Tim Pietzcker对此的回答。是的,谢谢你的提示。我删除了那部分。
>>> a = ["Hello"]
>>> b = a
>>> a is b
True
>>> a[0] = "Goodbye"
>>> b
['Goodbye']
>>> a = ["Hello"]
>>> b = ["Hello"]
>>> a is b
False
>>> id(a[0])
33846096L
>>> id(b[0])
33846096L