当变量为不可变对象时,函数调用是值传递
当变量为可变对象时,函数调用是引用传递
什么是值传递:
值传递过程中,被函数调用的形参被作为函数的局部变量处理,也就是在堆栈中开辟了内存空间以存放由主调用函数放进来的实参的值,从而成为了实参的一个副本
值传递的特点是被调用函数对形参的任何操作都是作为局部变量进行,不会影响主函数的实参变量的值
def test1(c): print "test before" print id(c) c+=1print "test after " print id(c) return c
>>> c = 1
>>> test1(c)
>>> print c
1
什么是引用传递:
引用传递过程中,被调用函数的形参虽然也被作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调用函数放进来的实参变量的地址,被调用函数对形参的任何操作都被处理成间接寻址,也就是通过堆栈中存放的地址访问主调用函数的实参变量,这样会影响主调用函数中的实参的值。
def test2(c): print "test before" print id(c) c.appned("1") print "test after " print id(c) return c >>> c = [1] >>> test2(c) >>> print c [1, "1"]
结论:python 不允许程序员选择采用传值还是传引用,Python参数传递采用的是”传对象引用“的方式,
这种方式相当于传值和传引用的一种综合。
1)如果函数收到的是一个可变对象(list , dict)的引用,就能修改对象的原始值,这相当于通过”传引用“来传递对象。
2)如果函数收到的是一个不可变对象,(int, tuple)的引用,就不能直接修改原始对象,相当于通过”传值“来传递对象