[英]How to pass a list by reference?
我正在尝试实现一个函数'add',它将列表L1
和L2
成L3
:
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]
作为一个良好的实践,你应该
另一个用户注意事项: 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.