python slice方法并不总是在内存中返回一个新地址?

时间:2014-05-21 08:24:58

标签: python

x = [1,2]
for i in range(4):
    y = x[:]
    print id(y)

结果如下:

4392626008 4392835408 4392626008 4392835408

我的目的是每次复制x并使用新容器执行某些操作。我的python是version 2.7.5,操作系统是Mac OS X 10.9,这有关系吗?

1 个答案:

答案 0 :(得分:4)

您永远不会发生y的所有事件 - 您只是在循环中将名称y重新绑定到x的副本,所以在循环的后期 - Python可能会选择为新切片重新分配相同的内存区域。由于CPython中的id返回内存地址,因此可能会得到相同的内容......

for i in range(4):
    # Rebinding `y` inside the loop - making the object available for garbage collection 
    y = x[:] 
    print id(y)

如果您要保留所有y,那么您将在CPython中获得唯一的id

>>> x = [1, 2]
>>> ys = [x[:] for _ in range(4)]
>>> map(id, ys)
[40286328, 40287568, 40287688, 40287848]