在python中b = a [:]会发生什么?

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.


ali*_*oar 6

a = [1,2,3]
b = a
Run Code Online (Sandbox Code Playgroud)

此处,b=a使 b 成为 a 的别名。这意味着,对 b 的所有更改都将在 a 中看到。

b=a[:]意思是复制a并将其分配给b。