函数
开发陷阱(一): 可变默认参数
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)]
|