Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将列表作为值而不是引用传递?_Python_List - Fatal编程技术网

Python 如何将列表作为值而不是引用传递?

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,

我有一个函数,它接受一个列表或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, 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:是的,从技术上和认知上你都是正确的