Chi*_*aJa 8 python python-2.7 python-3.x
>>>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 ???
Run Code Online (Sandbox Code Playgroud)
发生了什么b = a [:](为什么不适用于数字-5到256)?
NPE*_*NPE 11
-5到256范围与以下内容有关:
当前实现为-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
Run Code Online (Sandbox Code Playgroud)
这当然是当前实施的人工制品.不同的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]
Run Code Online (Sandbox Code Playgroud)
如您所见,[:]只需复制引用即可.这解释了为什么要a[i] is b[i]评估True所有人i.
a = [1,2,3]
b = a
Run Code Online (Sandbox Code Playgroud)
此处,b=a使 b 成为 a 的别名。这意味着,对 b 的所有更改都将在 a 中看到。
b=a[:]意思是复制a并将其分配给b。