python 不应该将列表作为函数的默认参数
示例:
from typing import List
def add_to(num, target: List=[]):
target.append(num)
return target
print(add_to(1))
print(add_to(2))
错误想法:
认为会输出两个长度均为1的列表
[1]
[2]
实际验证:
from typing import List
def add_to(num, target: List=[]):
print(id(target))
target.append(num)
return target
print(add_to(1))
print(add_to(2))
实际输出:
4429714432
[1]
4429714432
[1, 2]
原因:
两次target的ID是一样的,这是因为默认参数作为函数的属性,函数定义时就被定义了,而不是在函数调用时才定义,所以在使用默认参数时,实际都是在使用同一个地址的变量。如果默认参数是列表或者字典这种可变对象,就会导致两次函数调用使用的默认参数是同一个对象,第二次调用函数时,第一次调用的结果被保留下来了, 导致修改错误。但如果默认参数是数字,字符串或者元组这种不可变的对象,就不会出现在这样的问题。应该避免使用可变对象作为默认参数。
正确用法:
from typing import List
def add_to(num, target=None):
if not target:
target = []
target.append(num)
return target
print(add_to(1))
print(add_to(2))
None可以是任意类型的空值,所以空值就设None,不要设置“”,[], {}等