📦 Python Mutable Default Args — Python 可变默认参数

v1.0.0

A Python function uses a mutable object (列出, dict, 设置) as a default argument, sharing 状态 across calls in a way that produces silent bugs.

0· 0·0 当前·0 累计
0
安全扫描
VirusTotal
无害
查看报告
OpenClaw
安全
high confidence
The 技能 is an instruction-only 图形界面de about Python mutable default-argument bugs; its clAIms, required resources, and instructions are coherent and proportionate.
评估建议
此技能仅以纯文本形式无害地解释 Python 编码陷阱及其修复方法,无需安装、无需凭证,也不会指示智能体读取或传输文件。你可安全启用或使用它来获取关于可变默认参数的指引。若打算采纳其建议,建议启用 linter(pylint/ruff)并在整个仓库中搜索形如 '=[]'、'={}'、'=set()' 的模式以定位需修复的实例。若需更严格保证,可自行查看 SKILL.md——它包含全部运行时指令且不执行任何外部操作。...
详细分析 ▾
用途与能力
名称和描述与 SKILL.md 内容一致。该技能仅说明一个常见的 Python 陷阱及其补救方法;不请求任何与此目的无关的二进制文件、凭据或配置。
指令范围
说明仅限于解释缺陷、展示安全代码模式、提供代码搜索启发式方法(如签名 '=[]'、'={}'、'=set()'),以及推荐 linter(pylint/ruff)。该技能不会指示 agent 读取系统文件、访问环境变量或向外部传输数据。
安装机制
未提供安装规范或代码文件(仅含说明)。安装此技能时不会向磁盘写入任何内容,也不会由安装程序执行任何操作。
凭证需求
该技能无需环境变量、凭据或配置文件路径,无需任何敏感权限即可完成所述功能。
持久化与权限
始终为 false,且该 skill 可由用户调用;允许自主调用(平台默认),但 skill 的指令无害,不需要提升或持续的系统权限。
安全有层次,运行前请审查代码。

运行时依赖

🖥️ OSmacOS · Linux · Windows

安装命令

点击复制
官方npx clawhub@latest install python-mutable-default-args
镜像加速npx clawhub@latest install python-mutable-default-args --registry https://cn.longxiaskill.com

技能文档

python-mutable-default-args Python 在函数定义时一次性计算默认参数值,而非每次调用时。若默认值为可变对象(list、dict、set),该对象会被所有使用默认值的调用共享。函数内修改它会改变后续所有调用的默认值。该 bug 在第二次或更晚调用才显现,产生难以追踪的状态相关失败。

症状

def add_item(item, items=[]):  # ← 共享列表
    items.append(item)
    return items

add_item("a") # ["a"] add_item("b") # ["a", "b"] ← 意外;第二次调用看到第一次的数据

函数在默认 list 或 dict 中累积数据,会在多次调用间无限增长。 本应无状态的函数在第二次调用时返回不同结果。 单元测试单独运行通过,一起运行时因共享状态失败。 若显式传入参数,bug 消失。

解决办法 用 None 作默认值,在函数体内初始化可变对象:

def add_item(item, items=None):
    if items is None:
        items = []
    items.append(item)
    return items
这是 Python 官方惯用法。每次省略 items 都会得到新列表。 同样适用于 dict、set 及其他可变类型。 规则:绝不要把可变对象作为默认参数。

代码审查时,扫描函数签名中的 =[]、={}、=set() 作为该模式的启发式线索。 linter(pylint 规则 W0102、ruff 规则 B006)会自动标记——若代码库未启用,请打开。

数据来源ClawHub ↗ · 中文优化:龙虾技能库