这是我的名为“ test.csv”的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]]
我只想更改列表“ r”中的内容,但是为什么列表“ a”没有保留原始的
[['aaa','',''],['ccc','ddd',''],['','eee','']]
? 最佳答案
发生这种情况的原因是,维护了对内部列表的相同引用。让我们将其取为整数:
如果您具有列表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]]
希望这可以帮助!
关于python - 在Python中从csv阅读器复制列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44590789/