为什么python中的'for'循环会更改未引用的列表?

Ray*_*szt 1 python variables scope for-loop list

我正在编写一个py脚本,它从csv文件中读取行,操作它们并将它们放回原处.到目前为止,我有csv列出转换工作.

我遇到的问题是当我遍历临时列表时,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']]
Run Code Online (Sandbox Code Playgroud)

所以上面的内容很简单(希望如此).(我们假设除了复制列表之外我还想做其他事情.只是想保持简单).

但现在这是我没有得到的部分.

>>> 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']]
Run Code Online (Sandbox Code Playgroud)

当我想修改子列表中的第一部分,并将其保存到新列表'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']]
Run Code Online (Sandbox Code Playgroud)

与上述问题类似,为什么y和t会发生变化?

提前致谢!!

Ign*_*ams 7

Python有什么,但引用.row是对lor中的实际元素的引用y.Mutating row变异该元素,并将其添加到另一个对象添加原始元素.

  • 使用`row [:]`复制`row`. (4认同)