展平列表时的不良副作用
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))
我只是在测试一些算法来展平一个列表,所以我在一个列表中创建了 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))