我正在处理一个py脚本,它从csv文件中读取行,对其进行操作并输出。目前我已经实现了将csv转换为列表的功能。
但是我遇到的问题是当我迭代临时列表时,for循环会改变所有的临时列表,而不仅仅是我想要的那一个。以下是我想表达的简单例子。
当我想要修改子列表中的第一个部分,并将其保存到一个新的列表 'z' 中时,它会同时修改列表 t!
那么这是怎么回事呢?z、y和t指向相同的内存位置吗?
另外,在这里发生了什么?
类似于上面的问题,为什么y和t会被改变?谢谢!
但是我遇到的问题是当我迭代临时列表时,for循环会改变所有的临时列表,而不仅仅是我想要的那一个。以下是我想表达的简单例子。
>>> l = [['hi', 'ho'],['no', 'go']]
>>> t = []
>>> y = []
>>>
>>> for row in l:
... row[0] = '123'
... y.append(row)
... t.append(row)
...
>>> y
[['123', 'ho'], ['123', 'go']]
>>> t
[['123', 'ho'], ['123', 'go']]
所以以上内容应该很简单易懂(希望如此)。 (假设我想做除了仅复制列表l之外的其他事情。只是想保持简单)。
但现在这里有一部分我不明白。
>>> z = []
>>> for row in y:
... row[0] = 'xxxx'
... z.append(row)
...
>>> z
[['xxxx', 'ho'], ['xxxx', 'go']]
>>> t
[['xxxx', 'ho'], ['xxxx', 'go']]
>>> y
[['xxxx', 'ho'], ['xxxx', 'go']]
当我想要修改子列表中的第一个部分,并将其保存到一个新的列表 'z' 中时,它会同时修改列表 t!
那么这是怎么回事呢?z、y和t指向相同的内存位置吗?
另外,在这里发生了什么?
>>> for rowx in y:
... rowx[0] = 'x55x'
... z.append(rowx)
...
>>> z
[['xxxx', 'ho'], ['x55x', 'go'], ['x55x', 'go'], ['x55x', 'go']]
>>> t
[['xxxx', 'ho'], ['x55x', 'go']]
>>> y
[['xxxx', 'ho'], ['x55x', 'go']]
类似于上面的问题,为什么y和t会被改变?谢谢!
row[:]
来复制row
。 - Katriellist
,是的。不过只是浅拷贝。 - Ignacio Vazquez-Abrams