为何Python函数中调用list()/dict()初始化的默认参数是可变的?
为什么用list()/dict()作函数默认参数会被PyCharm标黄?
这不是PyCharm的bug,是Python本身的特性导致的问题,下面给你拆解清楚:
1. 为什么list和dict是可变对象?
在Python中,list(列表)和dict(字典)属于可变对象——它们的内容可以在原地修改(比如给列表append元素、给字典新增键值对),修改后对象的内存地址不会改变。而像整数、字符串、元组这类属于不可变对象,一旦创建就无法修改内部内容。
2. 默认参数的创建时机导致的陷阱
Python的函数默认参数是在函数定义阶段就创建完成的,而不是每次调用函数时重新生成。这意味着,如果你用list()或dict()作为默认参数,这个列表/字典对象会被所有函数调用共享。
举个实际的例子就能看出问题:
def my_function(param1: list = list()): param1.append(1) print(param1) my_function() # 输出 [1] my_function() # 输出 [1, 1] my_function() # 输出 [1, 1, 1]
每次调用函数,都会往同一个共享的列表里添加元素,这显然和你“每次默认使用空列表”的预期不符。
PyCharm标黄就是在提醒你这个Python开发中的常见陷阱,帮你避免写出不符合预期的代码。
3. 正确的写法
应该用None作为默认参数的占位符,然后在函数内部初始化可变对象:
def my_function(param1: list = None, param2: dict = None): param1 = param1 if param1 is not None else [] param2 = param2 if param2 is not None else {} # 后续业务逻辑
这样每次调用函数时,如果没有传入参数,都会创建一个全新的空列表/字典,不会出现共享对象的问题。
内容的提问来源于stack exchange,提问作者Daniel Kanzel
相关产品推荐
相关产品推荐

