>>>a=[999999,2,3]
>>>b=[999999,2,3]
>>>print(a[0] is b[0])
False#because it works for numbers -5 through 256
>>>a=[1,2,3]
>>>b=a[:]
>>>print(a[0] is b[0])
True#because it works for numbers -5 through 256
>>>a=[999999,2,3]
>>>b=a[:]
>>>print(a[0] is b[0])
True#why not False ???
发生了什么b = a [:](为什么不适用于数字-5到256)?
答案 0 :(得分:11)
-5到256范围与following:
有关当前实现为-5到256之间的所有整数保留一个整数对象数组,当您在该范围内创建
int
时,实际上只返回对现有对象的引用。
为了证明这一点,请注意id(123)
如何保持返回相同的值,而id(9999)
可以返回不同的值:
In [18]: id(123)
Out[18]: 9421736
In [19]: id(123)
Out[19]: 9421736
In [20]: id(9999)
Out[20]: 9708228
In [21]: id(9999)
Out[21]: 10706060
这当然是当前实施的一个假象。不同的Python实现可能不会这样做,或者可能使用不同的范围。
关于你的上一个例子:
In [14]: a=[999999, 2, 3]
In [15]: b=a[:]
In [16]: map(id, a)
Out[16]: [10908252, 9421180, 9421168]
In [17]: map(id, b)
Out[17]: [10908252, 9421180, 9421168]
如您所见,[:]
只是复制引用。这解释了为什么a[i] is b[i]
评估所有True
的{{1}}。
答案 1 :(得分:1)
a=[1,2,3]
b=a
使b成为a的别名。这意味着,对b的所有更改都将在。
b = a [:]表示制作a的副本并将其分配给b。
答案 2 :(得分:1)
>>>b=a[:]
制作列表a中项目的浅表副本和复制b的名称。新列表中包含的所有项目将具有与原始列表中的项目相同的对象ID(思考指针)。这是预期的行为。
答案 3 :(得分:1)
添加到@NPE's answer,这是一个很好的例子:
a = range(-7, 259)
b = range(-7, 259)
for x, y in zip(a,b):
print x, x is y
打印:
-7 False
-6 False
-5 True
-4 True
...
255 True
256 True
257 False
258 False