我有两个代码用于将参数传递给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中通过引用传递,而在第二个代码中它是通过值传递的?
答案 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.指针)。始终通过引用操纵对象。人们为此提出了不同的名称,但无论他们称之为什么,他们所描述的内容在语义上等同于传递对象引用的值。
无论何时传递或分配,都会复制值(引用)。这意味着被调用的函数有自己的参数副本(这是一个引用)。因此,分配给此变量对调用者没有影响。从不。
在第一个代码中,您没有分配参数。相反,您通过对其指向的对象的引用调用方法。此方法修改对象。所以当然任何有参考指向同一个对象的人都会看到它。