Python函数:多次调用调用函数且不为默认值参数传递值的危险后果

来自CloudWiki
跳转至: 导航搜索
  • 多次调用函数并且不为默认值参数传递值时,默认值参数只在定义时进行一次解释和初始化,对于列表、字典这样可变类型的默认值参数,这一点可能会导致很严重的逻辑错误。例如:
>>> def demo(newitem, old_list=[]):
    old_list.append(newitem)
    return old_list

>>> print(demo('5', [1, 2, 3, 4]))
[1, 2, 3, 4, '5']
>>> print(demo('aaa', ['a', 'b']))
['a', 'b', 'aaa']
>>> print(demo('a'))
['a']
>>> print(demo('b'))                 #注意这里的输出结果
['a', 'b']
  • 一般来说,要避免使用列表、字典、集合或其他可变序列作为函数参数默认值,对于上面的函数,更建议使用下面的写法。
def demo(newitem, old_list=None):
    if old_list is None:
        old_list = []
    old_list.append(newitem)
    return old_list
  • 函数的默认值参数是在函数定义时确定值的,所以只会被初始化一次。
>>> i = 3
>>> def f(n=i):                 #参数n的值仅取决于i的当前值
    print(n)
>>> f()
3
>>> i = 5                       #函数定义后修改i的值不影响参数n的默认值
>>> f()
3
>>> i = 7
>>> f()
3
>>> def f(n=i):                 #重新定义函数
    print(n)
>>> f()
7