在Python中复制csv阅读器中的列表

时间:2017-06-16 13:41:53

标签: python python-3.x csv

这是我的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','']]

3 个答案:

答案 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[:])