繁体   English   中英

如何通过引用传递列表?

[英]How to pass a list by reference?

我正在尝试实现一个函数'add',它将列表L1L2L3

def add(L1,L2,L3):
    L3 = L1 + L2

L3 = []
add([1],[0],L3)
print L3

上面的代码产生一个空列表而不是[1,0] - 这意味着L3没有通过引用传递。

如何通过引用传递L3

列表已经通过引用传递,因为所有 Python名称都是引用,列表对象是可变的。 使用切片分配而不是正常分配。

def add(L1, L2, L3):
    L3[:] = L1 + L2

但是,这不是编写函数的好方法。 您应该只返回组合列表。

def add(L1, L2):
    return L1 + L2

L3 = add(L1, L2)

你可以用:

L3[:] = L1 + L2

测试代码:

def add(L1, L2, L3):
    L3[:] = L1 + L2

L3 = []
add([1], [0], L3)
print(L3)

结果:

[1, 0]

如果你想被就地进行更改,你需要执行修改列表就地操作。 这将意味着任何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]

作为一个良好的实践,你应该

  • 定义一个不修改原始结构的函数,但返回一个可以从调用者分配的新值OR
  • 定义一个修改结构的函数,不返回任何内容。

另一个用户注意事项: L3[:] = ... L1 + L2的项目替换其所有先前内容的L3 另一方面, L3.extend(...)不会破坏先前在L3 ,而是通过它传递的内容进行扩展 我建议您评估您的用例并使用更合适的方法来处理这种情况。

但是,为了迎合这种情况,您可以使用__setitem__使用就地分配来构建接受的答案方法:

def add(L3, *L):
    L3[:] = chain.from_iterable(L)

其工作方式相同,对于许多列表应该非常有效。

您不能通过Python中的引用显式传递变量,但可以更新现有对象的属性。

因此,您可以做的是更新L3值,所有这些都在您的情况下,所以您可以这样做:

def add(L1 ,L2, L3):
    L3[:] = L1 + L2

L3 = []

add([1], [0], L3)

print L3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM