展平列表时的不良副作用

Unwanted side effects when flattening a list

我只是在测试一些算法来展平一个列表,所以我在一个列表中创建了 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 并且这就是它修改它的原因,但是,我仍然认为,因为它在函数内部,它会不会发生,更重要的是

如何避免这种情况发生?

谢谢!

"I understand that one is still pointing to the original lst and that is the reason it is modifying it, but still, I though that, since this was inside a function, it would not happen,"

这没有任何意义。无论你在哪里改变一个对象,它仍然会改变

无论如何,突变的发生是因为:

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))