在Python中复制列表
我想复制一个列表,然后对这个复制的列表做一些操作。但是奇怪的是,我的原始列表也被修改了。我已经查看了不同的内存分配方式和列表赋值的方法,但到现在为止还没有找到解决办法……有没有什么建议?
row = 0
column = 0
table1 = copy.copy(table[:])
temptable = []
temptable = table[:]
print id(table)
print table
print id(table1)
print table1
print id(temptable)
print temptable
for i in temptable:
for j in i:
if type(j) == str:
temptable[row][column] = 0
column = column + 1
column = 0
row = row + 1
result=[]
for column in zip(*temptable):
try:
result.append(sum(map(int,column)))
except ValueError:
result.append(0)
print table
print table1
print temptable
/#### 结果
163783148
[[0, 'ZZZ', 'XXX', 'YYY', 'AAA', 0, 0], ['BBB', 1, 1, 0, 26, 28, 0], ['CCC', 26, 0, 0, 0, 26, 0], ['DDD', 0, 26, 0, 0, 26, 0], ['EEE', 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]]
163669036
[[0, 'ZZZ', 'XXX', 'YYY', 'AAA', 0, 0], ['BBB', 1, 1, 0, 26, 28, 0], ['CCC', 26, 0, 0, 0, 26, 0], ['DDD', 0, 26, 0, 0, 26, 0], ['EEE', 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]]
163783468
[[0, 'ZZZ', 'XXX', 'YYY', 'AAA', 0, 0], ['BBB', 1, 1, 0, 26, 28, 0], ['CCC', 26, 0, 0, 0, 26, 0], ['DDD', 0, 26, 0, 0, 26, 0], ['EEE', 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]]
[[0, 0, 0, 0, 0, 0, 0], [0, 1, 1, 0, 26, 28, 0], [0, 26, 0, 0, 0, 26, 0], [0, 0, 26, 0, 0, 26, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]]
[[0, 0, 0, 0, 0, 0, 0], [0, 1, 1, 0, 26, 28, 0], [0, 26, 0, 0, 0, 26, 0], [0, 0, 26, 0, 0, 26, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]]
[[0, 0, 0, 0, 0, 0, 0], [0, 1, 1, 0, 26, 28, 0], [0, 26, 0, 0, 0, 26, 0], [0, 0, 26, 0, 0, 26, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]]
4 个回答
2
你还应该复制里面的列表,所以可以使用deepcopy
这个方法,它可能会对你有帮助。
4
你需要用到deepcopy
,这样才能把列表里的对象也复制一份,而不仅仅是复制它们的引用。
12
你的原始列表里面包含了内部列表:
[[0, 'ZZZ', 'XXX', 'YYY', 'AAA', 0, 0],
['BBB', 1, 1, 0, 26, 28, 0], ...
]
这些内部列表实际上是以引用的方式存储的,也就是说:
[ location-of-list-0,
location-of-list-1, ...
]
当你复制这个列表时,其实是复制了一份指向原始列表中相同内部列表的引用。这种方式叫做浅拷贝,因为它复制的是引用,而不是内容。
如果想要创建一个完全独立的列表,可以使用深拷贝。