Skip to main content
 首页 » 编程设计

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

2025年05月04日11artech

我正在编写一个 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']] 

所以上面的内容很简单(希望如此)。 (假设我除了复制列表 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变了?

提前致谢!

请您参考如下方法:

Python 只有 引用。 row 是对 l 或 y 中实际元素的引用。改变 row 会改变该元素,并将其添加到另一个对象会添加原始元素。