Python函数的参数默认值

遇到一个坑,Python会将函数定义中的参数默认值存储在一个全局变量中:function.__defaults__

这导致一个问题,如果在函数的参数默认值中创建了一个对象,如果在后续的代码中修改了这个对象的属性,那么下一次调用函数时,参数的默认值将是修改后的对象!!!

考虑下面的代码:

def a(x = {}):
    print(x)
    return x

x = a() # print out {}

x['b'] = 1

y = a() # print out {'b': 1}

结论:在函数的默认值中,一定要使用不可变对象,避免默认值的对象被修改后,导致程序BUG。

参考资料:https://stackoverflow.com/questions/4841782/python-constructor-and-default-value

comments powered by Disqus