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