Python 函数相关的两个问题

作者: 江洋林澜 | 来源:发表于2018-04-07 19:10 被阅读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)]
    

    相关文章

      网友评论

        本文标题:Python 函数相关的两个问题

        本文链接:https://www.haomeiwen.com/subject/pqayhftx.html