Python可变默认参数规避方案:为何需要if L is None判断?
关于Python可变默认参数规避方案的疑问解答
首先得明确:默认参数设为None,不代表每次调用时L一定是None——用户可以主动给这个参数传入其他值,这就是需要if判断的核心原因。
举个实际的例子,我们定义这样的函数:
def add_item(item, L=None): if L is None: L = [] L.append(item) return L
- 当你不带第二个参数调用,比如
add_item("apple"),这时L用默认值None,if条件触发,创建一个新的空列表,添加元素后返回["apple"];下次再这么调用,会重新创建新的空列表,完全不会出现累积修改的问题。 - 但如果你主动传入一个列表,比如
my_list = ["banana"],然后调用add_item("apple", my_list),这时L就是你传入的my_list,if条件不触发,直接在这个列表里添加元素,最后my_list会变成["banana", "apple"]——这才是合理的行为:用户主动传了列表,就应该操作这个列表,而不是被强制换成空列表。
如果去掉if判断,直接写L = [],那不管用户传没传参数,L都会被改成空列表。比如你传入了自己的my_list,函数里还是会把L重置为空,完全违背了用户传参的意图。
所以这个if判断是为了区分两种场景:
- 场景1:用户没传参数,用默认的
None,我们创建新的空列表,规避可变默认参数的累积修改问题; - 场景2:用户主动传了列表(或其他可迭代对象),就用用户传入的那个对象,正常执行操作。
内容的提问来源于stack exchange,提问作者Kraken
相关产品推荐
相关产品推荐

