簡體   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