Python唯一支持的参数传递模式是 共享传参, 即函数的各个参数获得实参中的各个引用的副本,也就是说,函数内部的形参是实参的别名。
从程序中可以看出对于不变类型的int或元组,变量没有改变,而作为可变类型的列表,变量发生了变化。
而很多时候我们不不想修改外部的数据,只想对传进来的数据进行修改。那么使用可变类型进行传参时也可能对外部数据进行修改,达不到预期的结果。下面是一个很难发现的问题。
不要使用可变类型作为参数的默认值
运行结果
从上面的程序和运行结果可知,bask1的运行结果正常,bask2没有传递参数,就赋值为默认的空列表,结果正常,而bask3一开始也是空的,应该是输出空列表,但结果不是,并且改变bask3的内容时,bask2的内容也发生了变化,问题在于bask2.teams和bask3.teams都指向了同一列表。出现这种情况的原因是因为self.teams变成了teams参数默认值的别名,默认值在定义函数时计算,因此默认值也变成了函数对象的属性。
可变默认值导致的这个问题说明了为什么通常使用None作为接收可变值的参数的默认值,解决方案可以是这样
解决方案
运行结果
从中可以看到bask2与bask3的结果不同,在引用外部数据时可加上list(),产生副本,对实例变量teams修改时就不会对basketball_team产生影响,如果不加list()函数,那么basketball_team内容也随之发生变化
提示:内容参考<<流畅的python>>这本书,写的很好
网友评论