函数
开发陷阱(一): 可变默认参数
def append_to(element, to=[]):
to.append(element)
return to
In: my_list = append_to(1)
In: my_list
Out: [1]
In: my_other_list = append_to(2)
In: my_other_list
Out: [1, 2]
函数调用之后, 会影响到之后调用函数的结果。
这是因为当默认参数值是可变对象的时候, 每次使用该默认参数的时候, 更改的是同一个变量。
解决方法: 使用一个完全不预期的值, 比如 None。
def append_to(element, to=None):
if to is None:
to = []
to.append(element)
return to
开发陷阱(二): 闭包变量绑定
def create_multipliers():
return [lambda x : i * x for i in range(5)]
In: for multiplier in create_multipliers():
...: print(multiplier(2))
...:
Out:
8
8
8
8
8
期望得到的值是 0, 2, 4, 6, 8
闭包中用到的变量的值是在内部函数被调用时查询得到的, 也就是延迟绑定。
for 循环中 i
最后的值为 4, 所以调用的 i
的值都是 4。
解决方法(一): 使用函数默认值
def create_multipliers():
return [lambda x, i=i : i * x for i in range(5)]
解决方法(二): 偏函数 partial
创建一个新函数, 固定住函数的参数 i 的值。
from functools import partial
from operator import mul
def create_multipliers():
return [partial(mul, i) for i in range(5)]