-1

我有两个代码用于将参数传递给 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 是通过引用传递的,而在第二个代码中它是通过值传递的?

4

5 回答 5

3

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

于 2012-08-15T18:01:38.763 回答
2

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

于 2012-08-15T18:05:30.603 回答
1

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

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

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)
于 2012-08-15T18:01:58.733 回答
1

修改对象和将名称重新分配给不同的对象是有区别的。对代码进行简单的更改,它可以始终如一地工作,因为现在它正在修改原始对象:

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

returnPS除非您返回一个值,否则函数末尾不需要a 。

于 2012-08-15T18:07:46.113 回答
-1

Python 具有按值传递的语义。总是。对象不是 Python 中的值。语言中的所有值都是引用(又名指针)。对象总是通过引用来操作的。人们为此提出了不同的名称,但无论他们如何称呼它,他们所描述的在语义上都等同于通过对象引用的值传递。

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

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

于 2012-08-15T18:45:32.223 回答