程序员程序猿阵线联盟-汇总各类技术干货

Python 函数相关的两个问题

2018-04-07  本文已影响0人  江洋林澜

函数

开发陷阱(一): 可变默认参数

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)]
上一篇 下一篇

猜你喜欢

热点阅读