Python 如何将列表作为值而不是引用传递?
我有一个函数,它接受一个列表或numpy数组v。 函数modify v使原始向量x也发生变化(因为这是一个参考)。我想要旧的x值。 有一些简单的解决方案,但它们看起来并不优雅 什么是解决这个问题的最有效的方法Python 如何将列表作为值而不是引用传递?,python,list,Python,List,我有一个函数,它接受一个列表或numpy数组v。 函数modify 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,
让我们考虑例如
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):
w = v[:] # Create a copy of v
w[2] = 6 # Modify the copy
return w # Return the copy
只需创建列表的副本,修改并返回副本
def change_2(v):
w = v[:] # Create a copy of v
w[2] = 6 # Modify the copy
return w # Return the copy
创建列表的副本:
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[:])
通过先创建完整副本,您现在有了一个不同的值。创建列表的副本:
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[:])
第一种表示法使用切片表示法创建列表的副本。
如果您的列表中有可变的引用,您将需要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.])
Python中的所有内容都是引用。如果需要不可变参数,请传递一个副本 可以轻松地将副本创建为
v[:]
或list(v)
所以你的电话变成了
z=change_2(x[:])
第一种表示法使用切片表示法创建列表的副本。
如果您的列表中有可变的引用,您将需要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.])
@第四,不,这是一个关于不同概念的问题(不幸的是,同名),它的方向相反。@delnan Yup。我现在收回它。@thefourtheye不,这是一个关于不同概念的问题(不幸的是,同名),它的方向相反。@delnan是的。我现在收回它。这是我一直在考虑的“不优雅”的解决方案。这是最适合蟒蛇的方式吗?有没有像def change_2(v*)这样的东西?@Donbeo:没有,你误解了正在传递的内容。Python专门处理对对象的引用,每个名称,加上容器内容和属性,都是对对象的引用,对象表示值。@Donbeo:您正在更改的值。
列表
对象,它本身就是一系列引用。您正在更改该列表对象内的引用。如果你不想这样做,那么你必须自己创建一个副本。这是我一直在考虑的“不优雅”的解决方案。这是最适合蟒蛇的方式吗?有没有像def change_2(v*)这样的东西?@Donbeo:没有,你误解了正在传递的内容。Python专门处理对对象的引用,每个名称,加上容器内容和属性,都是对对象的引用,对象表示值。@Donbeo:您正在更改的值。列表
对象,它本身就是一系列引用。您正在更改该列表对象内的引用。如果您不想这样做,那么您必须自己创建一个副本。从技术上讲,所有列表都有内部引用(尽管有时并不重要,因为引用的对象是不可变的,例如int)。对于numpy数组,切片返回一个视图IIRC。@delnan:是的,从技术上和认知上讲,您是正确的。从技术上讲,所有列表中都有引用(尽管有时并不重要,因为引用的对象是不可变的,例如int)。对于numpy数组,切片返回一个视图IIRC。@delnan:是的,从技术上和认知上你都是正确的