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

4 回答 4

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

这当然是当前实现的产物。不同的 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]

如您所见,[:]只需复制引用即可。这解释了为什么对alla[i] is b[i]求值。Truei

于 2012-11-24T07:27:46.940 回答
5
a = [1,2,3]
b = a

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

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

于 2012-11-24T07:29:40.883 回答
2
 >>>b=a[:]

对列表 a 中的项目和复制 b 的名称进行浅拷贝。新列表中包含的所有项目都将具有与原始列表中的项目相同的对象 ID(思考指针)。这是预期的行为。

于 2012-11-24T07:30:12.490 回答
1

添加到@NPE 的答案,这里有一个很好的说明:

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
于 2012-11-24T07:51:13.373 回答