这是我的csv文件名为' test.csv':
aaa,,
ccc,ddd,
,eee,
这是我的代码:
import csv
with open('test.csv', 'rt') as f:
a = list(csv.reader(f))
r = a[:]
for row in r:
for index in range(3):
if row[index] == '':
row[index] = 'xxx'
print(r)
print(a)
结果:
[['aaa','xxx','xxx'],['ccc','ddd','xxx'],['xxx','eee','xxx]]
[['aaa','xxx','xxx'],['ccc','ddd','xxx'],['xxx','eee','xxx]]
我只想更改列表中的内容,但为什么要列出“' a'没有保留原来的那个[['aaa','',''],['ccc','ddd',''],['','eee','']]
?
答案 0 :(得分:1)
发生这种情况的原因是正在维护对内部列表的相同引用。让我们把它作为整数代替:
如果您有a = [1, 2, 3]
列表,那么当您执行[1, 2, 3]
时,您预计b也会b = a[:]
。您的示例就是这种情况。该列表存储指向其他列表的指针。如果您只是复制列表,您将获得相同的指针并修改相同的基础列表,如下所示:
In [14]: a = [[1,2,3],[4,5,6],[7,8,9]]
In [15]: b = a[:]
In [16]: id(a)
Out[16]: 4499634512
In [17]: id(b)
Out[17]: 4499967296
In [18]: id(a[0])
Out[18]: 4499909664
In [19]: id(b[0])
Out[19]: 4499909664
请注意,虽然id(a)
和id(b)
不同,但id(a[0])
和id(b[0])
是相同的。执行b = a[:]
会创建列表的浅层副本。
您需要制作深层副本。这可以使用deepcopy
库的copy
函数来完成。
In [20]: from copy import deepcopy
In [21]: c = deepcopy(a)
In [22]: id(c[0])
Out[22]: 4500008112
In [23]: id(a[0])
Out[23]: 4499909664
In [24]: a[0][0] = 42
In [25]: a
Out[25]: [[42, 2, 3], [4, 5, 6], [7, 8, 9]]
In [26]: c
Out[26]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
希望这有帮助!
答案 1 :(得分:0)
因为a
是列表,所以外部列表是行,内部列表是每行中的列。执行a[:]
会复制外部列表,但该复制列表中的每个元素仍然是对原始内部列表的引用。
您应该使用copy.deepcopy
代替。
答案 2 :(得分:0)
那么在这种情况下你需要深层复制列表。 r = a[:]
不做深层复制。
尝试:
import copy;
r = copy.deepcopy(a[:])