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

时间:2012-11-24 07:24:36

标签: python python-3.x python-2.7

    >>>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)?

4 个答案:

答案 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