Python函数参数传递方式以及一致性
我们首先来看两个示例:
示例1:
>>> a = 1
>>> def func(b):
b = 2
>>> a
1
示例2:
>>> a = [1]
>>> def func(b):
b.append(2)
>>> func(a)
>>> a
[1, 2]
我们发现在示例1中a所指向对象的值未被修改。而示例2中,a所指向对象的值却已经被修改了。我们进一步跟踪将发现,
示例1中在“b = 2”语句执行后,a和b所指向的对象是不同的(id(a) != id(b));而在示例2中,a和b所指向的对象是同一个。
有一种解释大概是——示例1中a所指向的对象为不可变对象,所以“b = 2”表达式将使得b指向另一个对象,也就是2,所以a指向
的对象值并没有被修改,因为它无法修改;示例2中,a为可变对象,所以b的修改将导致a所指向的对象同时被修改,因为它可以
修改。这个解释勉强能解释的通,但是,是错的。我们来看另一个例子:
示例3:
>>> a = [1]
>>> def func(b):
b = [2]
>>> a
[1]
示例3中a为可变对象,但是a所指向的对象值依然没有改变,进一步跟踪会发现在“b = [2]”表达式后,a和b指向的对象是不同的。
我想我们现在应该发现问题所在了。问题就在“=”操作符(“b = 2”、“b = [2]”)。
Python的“=”操作符的作用就是将name和object关联起来,并将(name, object reference)值对加入当前命名空间。也就是说“b = 2”
表达式并不是修改b所指向的对象的值,而是将b指向“2”对象。
综上所述,Python函数参数传递方式是一致的,为call by object reference。