作者WangQiaomei版本1.02026/3/24标签Python 避坑、dataclass、面试必问、生产环境 bug 警告如果你在函数 /dataclass 里用过[]、{}、set()当默认值 —— 赶紧改它会让你代码出现幽灵数据、脏数据、跨实例污染线上排查一天都找不到原因一、先看地狱级现场列表坑你以为每次调用都会生成新的空列表大错特错Python 只在定义函数时创建一次之后永远共用同一个对象python运行# ❌ 致命错误写法 def add_skill(name, skills[]): skills.append(name) return skills print(add_skill(skill1)) # [skill1] print(add_skill(skill2)) # [skill1, skill2] ← 见鬼了 print(add_skill(skill3)) # [skill1, skill2, skill3] ← 彻底疯了现象每次调用都在 “继承” 上一次的数据本质全局共用一个列表实例二、不止列表这 3 种全是巨坑99% 人中招坑 1字典{}作为默认值python运行# ❌ 错误 def add_data(key, value, data{}): data[key] value return data调用多次数据会互相污染、叠加坑 2集合set()作为默认值python运行# ❌ 错误 def add_item(item, itemsset()): items.add(item) return items坑 3自定义类实例继承 list/dictpython运行class MyList(list): pass # ❌ 错误 def test(objMyList()): obj.append(1) return obj三、一句话讲透底层原因面试必问Python 函数默认值只在函数定义时创建一次全局共用同一个对象不是每次调用都新建不是每次调用都新建不是每次调用都新建四、✅ 标准正确写法万能模板python运行# ✅ 正确写法永远不会错 def add_skill(name, skillsNone): if skills is None: skills [] # 每次调用都新建 skills.append(name) return skills字典、集合、自定义对象都一样python运行def add_data(key, value, dataNone): if data is None: data {}五、 dataclass 怎么写你架构里的关键知识点你在 AI Agent 架构里用的这行就是为了避开这个天坑python运行skills: List[str] field(default_factorylist)❌ 错误dataclass 直接报错python运行dataclass class AgentMeta: skills: List[str] [] # 非法共享列表✅ 正确python运行dataclass class AgentMeta: skills: List[str] field(default_factorylist)为什么正确因为default_factory会在每次创建实例时调用一次 每次都生成新列表六、一张图看懂区别终生不忘plaintext❌ 错误写法所有实例共用一个列表 agent1.skills ──┐ agent2.skills ──┼──→ 【同一个列表对象】 agent3.skills ──┘ ✅ 正确写法每个实例自己独立列表 agent1.skills ──→ [列表1] agent2.skills ──→ [列表2] agent3.skills ──→ [列表3]七、总结背下来面试直接封神永远不要用[] / {} / set()做函数默认值永远不要用可变对象做 dataclass 默认值正确做法默认 None → 内部初始化dataclass 用field(default_factorylist)本质Python 默认值只创建一次
Python 史上最隐蔽大坑!90% 老手都栽过:可变对象默认参数,一用就错!
作者WangQiaomei版本1.02026/3/24标签Python 避坑、dataclass、面试必问、生产环境 bug 警告如果你在函数 /dataclass 里用过[]、{}、set()当默认值 —— 赶紧改它会让你代码出现幽灵数据、脏数据、跨实例污染线上排查一天都找不到原因一、先看地狱级现场列表坑你以为每次调用都会生成新的空列表大错特错Python 只在定义函数时创建一次之后永远共用同一个对象python运行# ❌ 致命错误写法 def add_skill(name, skills[]): skills.append(name) return skills print(add_skill(skill1)) # [skill1] print(add_skill(skill2)) # [skill1, skill2] ← 见鬼了 print(add_skill(skill3)) # [skill1, skill2, skill3] ← 彻底疯了现象每次调用都在 “继承” 上一次的数据本质全局共用一个列表实例二、不止列表这 3 种全是巨坑99% 人中招坑 1字典{}作为默认值python运行# ❌ 错误 def add_data(key, value, data{}): data[key] value return data调用多次数据会互相污染、叠加坑 2集合set()作为默认值python运行# ❌ 错误 def add_item(item, itemsset()): items.add(item) return items坑 3自定义类实例继承 list/dictpython运行class MyList(list): pass # ❌ 错误 def test(objMyList()): obj.append(1) return obj三、一句话讲透底层原因面试必问Python 函数默认值只在函数定义时创建一次全局共用同一个对象不是每次调用都新建不是每次调用都新建不是每次调用都新建四、✅ 标准正确写法万能模板python运行# ✅ 正确写法永远不会错 def add_skill(name, skillsNone): if skills is None: skills [] # 每次调用都新建 skills.append(name) return skills字典、集合、自定义对象都一样python运行def add_data(key, value, dataNone): if data is None: data {}五、 dataclass 怎么写你架构里的关键知识点你在 AI Agent 架构里用的这行就是为了避开这个天坑python运行skills: List[str] field(default_factorylist)❌ 错误dataclass 直接报错python运行dataclass class AgentMeta: skills: List[str] [] # 非法共享列表✅ 正确python运行dataclass class AgentMeta: skills: List[str] field(default_factorylist)为什么正确因为default_factory会在每次创建实例时调用一次 每次都生成新列表六、一张图看懂区别终生不忘plaintext❌ 错误写法所有实例共用一个列表 agent1.skills ──┐ agent2.skills ──┼──→ 【同一个列表对象】 agent3.skills ──┘ ✅ 正确写法每个实例自己独立列表 agent1.skills ──→ [列表1] agent2.skills ──→ [列表2] agent3.skills ──→ [列表3]七、总结背下来面试直接封神永远不要用[] / {} / set()做函数默认值永远不要用可变对象做 dataclass 默认值正确做法默认 None → 内部初始化dataclass 用field(default_factorylist)本质Python 默认值只创建一次