扁平化列表时不需要的副作用



我只是在测试一些算法来压平列表,所以我在列表中创建了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))

最新更新