[英]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.