Python中函数的参数传递机制都是“值传递”。所谓值传递,就是将实际参数的副本(复制品)传入函数,而参数本身不会受到任何影响。看例子:def swap(a , b) : # 下面代码实现a、b变量的值交换 a, b = b, a print("swap函数里,a的值是",a, ";b的值是", b)a = 6b = 9swap(a , b)print("交换结束后,变量a的值是",a , ";变量b的值是", b)
执行过程(按值传递理解):
- 主程序中定义变量:
- 调用
swap(a, b)时: - 系统把当前
a 的值(6)和 b 的值(9)复制一份,传给函数swap - 也就是说,函数内部的
a - 这个过程就是值传递:实参的值被复制给形参,函数内部操作的是副本。
- 在
swap函数内部执行 a, b = b, a: - 把函数内部的
- 此时函数内的
- 打印输出:
swap函数里,a的值是 9 ;b的值是 6
- 函数执行结束,返回主程序:
- 函数内部的
- 主程序中的原始变量
a和 b从未被修改,仍然保持原来的值:6 和 9。 - 所以最后一行输出:
交换结束后,变量a的值是 6 ;变量b的值是 9
值传递实质:实参的值被复制给形参,函数内部对形参的任何修改都不会影响主程序中的原始变量。传的是值的副本,不是原始变量本身。接下来是引用传递:def swap(dw): # 下面代码实现dw的a、b两个元素的值交换 dw['a'], dw['b'] = dw['b'], dw['a'] print("swap函数里,a元素的值是",dw['a'], ";b元素的值是", dw['b']) # 把dw直接赋值为None,让它不再指向任何对象 dw = Nonedw = {'a': 6, 'b': 9}swap(dw)print("交换结束后,a元素的值是",dw['a'], ";b元素的值是", dw['b'])
第一步:主程序创建字典
第二步:调用 swap(dw)
- 把
dw传给函数参数 dw。 - 在 Python 中,字典是可变类型,当它作为参数传入函数时,函数内部的参数
dw 和主程序中的 dw指向同一个字典。 - 这种行为看起来像“引用传递”:函数内对字典内容的修改,会直接反映到主程序中。
dw['a'], dw['b'] = dw['b'], dw['a']
- 这行代码修改了字典内部的数据:
- 因为函数内的
dw 和主程序的 dw指向同一个字典,所以这个修改是全局生效的。 - 打印输出:
swap函数里,a元素的值是 9 ;b元素的值是 6
第四步:dw = None
- 这行代码只是让函数内部的局部变量
dw - 这不会影响主程序中的
dw - 主程序中的
dw仍然指向那个已经被修改过的字典{'a': 9, 'b': 6}。
第五步:函数返回,执行主程序打印
print("交换结束后,a元素的值是", dw['a'], ";b元素的值是", dw['b'])
- 主程序的
dw - 所以输出:
交换结束后,a元素的值是 9 ;b元素的值是 6