1

我有以下代码按预期工作:

a = [1, 2, 3, 4]
b = a

>>> b is a
True

如果我稍微改变一下它仍然可以工作:

a = [1, 2, 3, 4]
b = a[2] * 2

>>> b is a[2] * 2
True

现在的问题:

a = [1, 2, 3, 4]
b = a * 2

>>> b is a * 2
False    

有人可以向我解释为什么这会返回 False,而b is a[2] * 2返回 True 吗?

4

3 回答 3

4

a是一个列表时,a * 2创建一个新的列表实例。如果你调用a * 2两次,你会创建两个新的列表实例——这就是b is a * 2yield的原因False

您获得的原因Trueb is a[2] * 2缓存小整数的 CPython 优化。由于整数在 Python 中是不可变的,所以无论你获得一个新实例还是一个缓存实例实际上都没有关系,对于小整数,如果你再次点击相同的整数,Python 会返回一个缓存版本。也试试

>>> a = [1, 2, 300, 4]
>>> b = a[2] * 2
>>> b is a[2] * 2
False
于 2011-03-10T20:45:43.357 回答
2

is除非它们引用相同的列表,否则相同的列表在比较时是不等价的。仅仅因为列表具有相同的值并不意味着它们引用内存中的相同列表。

例如,

>>> a = [1,2,3]
>>> id(a) # memory location list a references
161267628
>>> b = [1,2,3]
>>> id(b) # memory location list b references, a different memory location than list a
161276396
>>> a == b 
True
>>> a is b
False
>>> c = a # by this method of assignment; c points to the same point that a does;
# hence changes to a and changes to c, will change both.
>>> id(c) # memory location that c references; this is the same as where a points.
161267628
>>> a is c
True
>>> c.append(4)
>>> print a
[1, 2, 3, 4]
>>> print b
[1, 2, 3]
>>> print c
[1, 2, 3, 4]
>>> d = a[:] # this just copies the values in a to d.  
>>> id(d)
161277036

这是有道理的,它们指向不同的内存位置,因为如果您可能想说更改第一个列表(如追加4到 end a)而不修改如果和指向内存中的相同位置b是不可能的。ab

于 2011-03-10T20:57:54.223 回答
0

a * 2 构造一个新列表,而整数与自身具有同一性。

>>> type(a[2] * 2)
<type 'int'>
>>> type(a * 2)
<type 'list'>
于 2011-03-10T20:45:23.727 回答