如果您想就地进行更改,则需要执行修改列表的操作就地。这意味着任何list 实例方法。在这种特殊情况下,您可以查看list.extend。
def add(L1, L2, L3):
L3.extend(L1 + L2) # creates a new list object and copies it into L3
由于这会创建一个副本(这可能效率低下),您可以改为使用两个 extend 调用来代替它 -
def add(L1, L2, L3):
L3.extend(L1)
L3.extend(L2)
调用L3.extend 会修改原始列表。使用您当前的代码,L1 + L2 会创建一个新列表,并将 L3 重新分配给该对象(并且未触及 L3 所指的原始对象)。
如果您想将此推广到任意数量的列表,我建议您看看使用可变参数:
from itertools import chain
def add(L3, *L):
L3.extend(chain.from_iterable(L))
这是一个如何工作的例子:
>>> L3 = []
>>> add(L3, [1], [2], [3])
>>> L3
[1, 2, 3]
作为一种良好做法,您应该
- 定义一个函数,该函数不修改原始结构,但返回一个可以从调用者分配的新值,或者
- 定义一个修改结构的函数,并且不返回任何内容。
另一个用户注释:L3[:] = ... 将 替换 L3 的所有以前的内容与来自 L1 + L2 的项目。另一方面,L3.extend(...) 不会破坏之前在L3 中的内容,而是通过传递的内容扩展。我建议评估您的用例并使用更适合这种情况的方法。
但是,为了适应这种情况,您可以使用 __setitem__ 的就地分配来构建接受的答案的方法:
def add(L3, *L):
L3[:] = chain.from_iterable(L)
它的工作方式相同,并且对于许多列表应该非常有效。