在Python中传递值

当你传递一个集合像列表,数组到Python中的另一个函数,它是否复制它,或者它只是一个指针?

Python 通过值传递引用到对象 。

Python通过值传递引用对象(比如Java),Python中的所有东西都是一个对象。 这听起来很简单,但是你会注意到一些数据types似乎具有传递值的特性,而另一些似乎像传递引用一样行事…这是怎么回事?

理解可变和不可变对象是很重要的。 一些对象,如string,元组和数字是不可变的。 在函数/方法内改变它们会创build一个新的实例,并且函数/方法之外的原始实例不会改变。 其他对象,如列表和字典是可变的,这意味着你可以在原地更改对象。 因此,改变一个函数/方法内的对象也会改变原来的外部对象。

事情是,整个参考/价值的概念将不适合python。 Python没有variables的“值”。 Python只有引用对象的对象和名称。

所以,当你调用一个函数,并在括号内放置一个“名称”,如下所示:

def func(x): # defines a function that takes an argument ... # do something here func(myname) # calling the function 

myname指向的实际对象被传递,而不是名称 myname 本身 。 在函数内部,给出另一个名字x )来引用传递的同一个对象。

你可以修改函数中的对象,如果它是可变的,但你不能改变外部名字指向什么 。 就像你做这件事一样

 anothername = myname 

所以我可以回答你的问题:

它是“通过价值”,但所有的价值观只是对象的引用。

这里的答案是有帮助的,但是我觉得需要展现我没有看到的这个很好的区别,我已经在随后的CL实验中certificate了这一点:

  1. 一个不可变的对象ALONE不能在函数调用中改变。 (到目前为止的答案已经说了很多…)
  2. 但是,包含在可变对象中的不可变对象可以在方法调用中重新分配。

'num'在这里不会改变,因为它是一个不可变的Number对象[支持我的要点1]:

 def incr_num(num): num += 1 num = 0 num 0 incr_num(num) num 0 

'list [0]'这里也是一个不可变的Number对象。

 def incr_list(list): list[0] += 1 list = [0] list[0] 0 incr_list(list) list[0] 1 

那么作为一个不可变的Number对象的'list [0]'是如何改变的(支持我的点2),而上面的例子的Number对象'num'没有改变? 不可变的Number对象'list [0]'包含在可变列表对象'list'中,而第一个例子中的'num'只是一个非限定的Number对象。

尽pipe我的意图很好,但我觉得@Stephen Pape评价最高的答案(以下引用)和其他一些类似的答案并不完全正确(这促使我写这个答案):

一些对象,如string,元组和数字是不可变的。 在函数/方法内改变它们会创build一个新的实例,并且函数/方法之外的原始实例不会改变。

我上面的第二个代码实验显示了一个Number对象('list [0]')在一个方法中被改变,然后原来的函数改变了。

一个引用被传递,但是如果该参数是一个不可变的对象,那么在该方法中修改它将会创build一个新的实例。

这是关于这个问题的一个线索。

该对象被传递。 不是副本,而是对基础对象的引用。

我也build议看看copy模块:

Python文档的副本

这将帮助您了解潜在的问题以及如何使用它来执行自己的深层复制。

引用:

 >>> x = [0,1,2,3] >>> def foo(x_list): x_list[0] = 1 >>> foo(x) >>> x [1, 1, 2, 3] 

请让我举一个简单的例子

 def swap(a, b): x = a print id(x) print id(a) print id(b) a = b print id(a) b = x print id(b) a[0]= '20' var1 = ['1','2','3','4'] var2 = ['5','6','7','8','9'] print id(var1) print id(var2) swap(var1, var2) print id(var1) print id(var2) print var1 print var2 

产生以下结果

28329344 var1 28331264 var2 28329344 x 28329344 a 28331264 b after a = b 28331264 a after b = x 28329344 b after 28329344 var1 28331264 var2 ['1','2','3','4'] ['20', '6','7','8','9']

映射到内存地址28329344 28331264 var1 var2 ab x后a = ba后b = xb后a [0] ='20'[0] ='20'返回['1','2','3' '4'] ['20','6','7','8','9']