You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:42:24