“Python函数:多次调用调用函数且不为默认值参数传递值的危险后果”的版本间的差异
来自CloudWiki
(创建页面,内容为“*多次调用函数并且不为默认值参数传递值时,默认值参数只在定义时进行一次解释和初始化,对于列表、字典这样可变类型…”) |
(没有差异)
|
2020年3月14日 (六) 10:21的最新版本
- 多次调用函数并且不为默认值参数传递值时,默认值参数只在定义时进行一次解释和初始化,对于列表、字典这样可变类型的默认值参数,这一点可能会导致很严重的逻辑错误。例如:
>>> 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