这是我的名为“ 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/

10-11 22:48
查看更多