簡體   English   中英

如何傳遞列表作為值而不是參考?

[英]how to pass a list as value and not as reference?

我有一個采用列表或numpy數組v的函數。該函數修改v,因此原始向量x也會發生變化(因為詛咒這是一個參考)。 我想擁有x的舊值。 有一些簡單的解決方案,但是它們看起來並不優雅。

解決此問題的最有效方法是什么?

讓我們考慮一下

def change_2(v):
    v[2]=6
    return v 

x=[1,2,3]
z=change_2(x)
print "x=", x,"z=",z
x= [1, 2, 6] z= [1, 2, 6] #I would like x=[1, 2, 3]

創建列表的副本

def change_2(v):
    v = v[:]
    v[2] = 6
    return v

Python 已經為您提供了值,即對象本身。 您正在通過更改其內容來更改該值。

v[:]提取列表中所有索引的一部分,創建一個新的列表對象來保存這些索引。 另一種方法是使用list()構造函數:

v = list(v)

另一種選擇是將創建副本的責任留給調用者:

def change_2(v):
    v[2] = 6
    return v 

x = [1,2,3]
z = change_2(x[:])

通過首先創建完整副本,您現在將獲得不同的價值。

Python中的所有內容都是參考。 如果需要一個不可變的參數,請傳遞一個副本。

可以輕松地將副本創建為v[:]list(v)

所以你的電話變成

z=change_2(x[:])

第一種表示法,使用切片表示法創建列表的副本。 如果您的列表中包含可變引用,則需要深度復制 ,可以通過copy.deepcopy實現

對於@delnan注釋的Numpy數組,切片符號返回的是視圖而不是副本。 要克服它,對於numpy數組,請使用copy方法

>>> def foo(v):
    v[0] = 1


>>> v = np.zeros(5)
>>> foo(v.copy())
>>> v
array([ 0.,  0.,  0.,  0.,  0.])

只需創建列表的副本,修改並返回副本

def change_2(v):
    w = v[:]      # Create a copy of v
    w[2] = 6      # Modify the copy
    return w      # Return the copy

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM