我只是在测试一些算法来压平列表,所以我在列表中创建了3个列表,然后尝试压平它。我从不接触原始列表,变量的名称不同,但当我尝试查看原始列表时,它已经被修改了,知道为什么会发生这种情况吗?
In [63]: xxx = [['R', 'L', 'D'], ['U', 'O', 'E'], ['C', 'S', 'O']]
In [64]: def flat_ind(lst):
...: one = lst[0]
...: for l in lst[1:]:
...: one += l
...: return one
...:
In [65]: flat = flat_ind(xxx)
In [66]: flat
Out[66]: ['R', 'L', 'D', 'U', 'O', 'E', 'C', 'S', 'O']
In [67]: xxx
Out[67]:
[['R', 'L', 'D', 'U', 'O', 'E', 'C', 'S', 'O'],
['U', 'O', 'E'],
['C', 'S', 'O']]
我知道one
仍然指向原始的lst
,这就是它修改它的原因,但我仍然认为,由于这是在函数内部,所以它不会发生,更重要的是
我该如何避免这种情况发生?
谢谢!
"我知道它仍然指向原始的lst,这就是它修改它的原因,但我仍然认为,由于这是在函数内部,所以不会发生,">
这没有任何意义。无论你在哪里突变一个对象,它仍然会被突变。
在任何情况下,突变的发生都是因为以下原因:
one += l
这是一种就地修改。你可以使用
one = on + l
相反,但这将是非常低效的。正如其他人所指出的,你可以复制第一个列表,
one = lst[0][:]
但是,像这样扁平化规则嵌套列表的惯用方法是简单地:
flat = [x for sub in xxx for x in sub]
或者,
from itertools import chain
flat = list(chain.from_iterable(xxx))