在Python中通过引用传递

时间:2012-08-15 17:59:22

标签: python pass-by-reference

我有两个代码用于将参数传递给Python中的函数。 1 -

def changeme( mylist ):
   mylist.append([1,2,3,4]);
   print "Values inside the function: ", mylist
   return

mylist = [10,20,30];
changeme( mylist );
print "Values outside the function: ", mylist

2 -

def changeme( mylist ):
   mylist = [1,2,3,4]; 
   print "Values inside the function: ", mylist
   return

mylist = [10,20,30];
changeme( mylist );
print "Values outside the function: ", mylist

为什么在第一个代码mylist中通过引用传递,而在第二个代码中它是通过值传递的?

5 个答案:

答案 0 :(得分:3)

在第一个示例中,您将信息附加到传入的列表中。在第二个示例中,您在返回之前重新分配mylist的本地值。这两个人没有做同样的事情。

答案 1 :(得分:2)

您需要意识到python中的赋值不会对左侧的对象进行操作。赋值在右侧创建对对象的新引用,并将该引用存储在左侧的名称中。因此,在您的第一个示例中,您会改变您输入的列表,并在稍后看到更改。在第二个示例中,在函数内部创建对列表的新引用(在右侧创建)并将其绑定到本地(到函数)变量mylist。因此mylist不再引用您输入到函数的对象。

答案 2 :(得分:1)

这是因为你将mylist分配给了函数2中的其他对象:

在python中,如果将可变对象传递给函数,则调用它 通过引用,如果你传递一个不可变对象,那么它被称为pass by value。

mylist = [1,2,3,4]


def changeme( mylist ):
   print (id(mylist))  #prints 180902348

   #at this point the local variable mylist points to [10,20,30] 
   mylist = [1,2,3,4];  #this reassignment changes the local mylist, 

   #now local mylist points to [1,2,3,4], while global mylist still points to [10,20,30] 
   print (id(mylist)) #prints 180938508 #it means both are different objects now 

   print ("Values inside the function: ", mylist)
   return

mylist = [10,20,30];
changeme( mylist );
print ("Values outside the function: ", mylist)

第一个:

def changeme( mylist ):
   print (id(mylist))      #prints 180902348

   mylist.append([1,2,3,4]);  #by this it mean [10,20,30].append([1,2,3,4])
   #mylist is just a label pointing to [10,20,30]
   print (id(mylist))       #prints 180902348  , both point to same object
   print ("Values inside the function: ", mylist)
   return

mylist = [10,20,30];
changeme( mylist );
print ("Values outside the function: ", mylist)

答案 3 :(得分:1)

修改对象和将名称重新分配给其他对象之间存在差异。对代码进行简单的更改并且它一致地工作,因为现在它正在修改原始对象:

def changeme( mylist ):
   mylist[:] = [1,2,3,4]; 
   print "Values inside the function: ", mylist

P.S。除非您返回一个值,否则函数末尾不需要return

答案 4 :(得分:-1)

Python具有按值传递语义。总是。对象不是Python中的值。语言中的所有值都是引用(a.k.a.指针)。始终通过引用操纵对象。人们为此提出了不同的名称,但无论他们称之为什么,他们所描述的内容在语义上等同于传递对象引用的值。

无论何时传递或分配,都会复制值(引用)。这意味着被调用的函数有自己的参数副本(这是一个引用)。因此,分配给此变量对调用者没有影响。从不。

在第一个代码中,您没有分配参数。相反,您通过对其指向的对象的引用调用方法。此方法修改对象。所以当然任何有参考指向同一个对象的人都会看到它。