我在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'原封不动的任何线索? 谢谢!
答案 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[:]
这些会复制gates
和a
列表