Mutable and Immutable Variables in Python

本文解决python中比较令人困惑的一个小问题:传递到函数中的参数若在函数中进行了重新赋值,对于函数外的原变量有何影响。看一个小栗子:

def fun(a):
    a=2
    return
a=1
fun(a)

请问程序执行后,a=1还是2?并解释原因。

实际上,这个问题有两个比较tricky的地方:

1. python的变量是没有类型的,类型属于对象,也就是说a就是一个指针,可以指向任何类型的对象,哪怕先后指向不同类型的对象也不会出错。

2. python中的对象分为mutable和immutable两种,二者在作为参数传递时有根本的区别。各个类型的对象分类见下表:

首先,代码中a=1的意思是,创建变量a(指针a),指向数字1这个对象的地址。在调用fun(a)的时候,因为数字对象是immutable的,所以传递到fun函数中的参数,实际上并不是a,而是a的复制品,暂且说成是b。b也是指向1这个对象的,所以说,之后在函数内部无论再怎么修改这个参数,和之前的变量a已经没有关系了。所以程序的执行结果是1。

再看一段代码:

def fun(a):
    a.append(4)
    return
a=[1,2,3]
fun(a)

 输出的结果是a=[1,2,3,4]。因为List是mutable的,所以传递到函数fun中的参数a是真真正正的a,而不是复制品。所以,在fun函数中对List的修改,会对函数外的a生效。

猜你喜欢

转载自www.cnblogs.com/rhyswang/p/9692014.html