赋值期间python中列表的行为

时间:2013-11-17 09:49:25

标签: python list

我在python中有以下代码:

gates=[16, 16, 24, 24, 24, 27, 32, 32, 32, 32, 32, 32, 40, 40, 40, 56, 56, 64, 96];
a=gates;
one=a[0];
b=a;
for i in range(0,len(a)):
    b[i]=a[i]/one

现在,在这结束时,我得到以下作为'b'的输出,如预期的那样:

>>> b
[1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 6]

但我希望'a'不变......但它也发生了变化。

>>> a
[1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 6]

令我惊讶的是,'盖茨'也发生了变化!

>>> gates
[1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 6]

关于如何保持'a'和'gate'原封不动的任何线索? 谢谢!

2 个答案:

答案 0 :(得分:3)

所有这些都是对同一个对象的引用,因此修改它们中的任何一个都会影响所有引用:

>>> gates=[16, 16, 24, 24, 24, 27, 32, 32, 32, 32, 32, 32, 40, 40, 40, 56, 56, 64, 96];
>>> import sys
>>> sys.getrefcount(gates)  #reference count to the object increased
2
>>> a = gates
>>> sys.getrefcount(gates)  #reference count to the object increased
3
>>> b = a
>>> sys.getrefcount(gates)  #reference count to the object increased 
4

如果您想要新副本,请使用[:]将新变量分配到浅层副本

>>> a = [1, 2, 3]
>>> b = a[:]
>>> a[0] = 100
>>> a
[100, 2, 3]
>>> b
[1, 2, 3]

如果列表本身包含可变对象,则使用copy.deepcopy

答案 1 :(得分:2)

试试这个:

a = gates[:]
b = a[:]

这些会复制gatesa列表