我有以下代码按预期工作:
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 吗?
我有以下代码按预期工作:
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 吗?
当a
是一个列表时,a * 2
创建一个新的列表实例。如果你调用a * 2
两次,你会创建两个新的列表实例——这就是b is a * 2
yield的原因False
。
您获得的原因True
是b is a[2] * 2
缓存小整数的 CPython 优化。由于整数在 Python 中是不可变的,所以无论你获得一个新实例还是一个缓存实例实际上都没有关系,对于小整数,如果你再次点击相同的整数,Python 会返回一个缓存版本。也试试
>>> a = [1, 2, 300, 4]
>>> b = a[2] * 2
>>> b is a[2] * 2
False
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
是不可能的。a
b
a * 2 构造一个新列表,而整数与自身具有同一性。
>>> type(a[2] * 2)
<type 'int'>
>>> type(a * 2)
<type 'list'>