20201022

it2026-10-07  2

参数的传递

函数的参数传递本质上就是:从实参到形参的赋值操作。 Python 中“一切皆对象”,所有的赋值操作都是用引用地址来赋值。所以,Python 中参数的传递也是通过引用地址来实现的。 具体操作时分为两类:

对“可变对象”进行“写操作”,会直接作用于原对象本身;(原对象变化)对“不可变对象”进行“写操作”,会产生一个新的“对象空间”,并用新的值填充这块空间。(起到其他语言的“值传递”效果,但不是“值传递”,即用的时候是用的原对象,操作结果放到新空间,原对象不变。)

可变对象有: 字典、列表、集合、自定义的对象等 不可变对象有: 数字、字符串、元组、function 等

传递可变对象时的引用

传递参数是可变对象(例如:列表、字典、自定义的其他可变对象等)时,实际还是对对象的引用。在函数体中不创建新的对象拷贝,而是可以直接修改所传递的对象。 【案例】

b = [10, 20] def f2(m): print('m:', id(m)) m.append(30) print('m:', id(m)) print('b:', id(b)) f2(b) print('b:', id(b)) print(b)

运行结果: 分析: 结果符合前面所阐述的特性。

但是这里要注意一个小问题:071.变量的作用域_全局变量_局部变量_栈帧内存分析讲解 中讲过如果要修改全局变量,需要用global声明,但这里没声名也修改了b,是因为通过将b赋值到函数的形参,使函数获得了使用和修改b所指向的对象的能力。

最新回复(0)