0

0

Python 如何让 dict.setdefault() 创建的默认值每次都是全新对象

冰川箭仙

冰川箭仙

发布时间:2026-01-27 17:55:31

|

433人浏览过

|

来源于php中文网

原创

dict.setdefault()的默认值被复用是因为default参数在调用时求值一次并复用同一对象;正确做法是用defaultdict或显式检查+构造,避免可变默认值污染。

python 如何让 dict.setdefault() 创建的默认值每次都是全新对象

为什么 dict.setdefault() 的默认值会被复用?

因为 setdefault(key, default) 中的 default 是**求值一次、传入一次**的表达式结果。如果你写 setdefault('items', []),空列表 [] 在调用时创建一次,之后所有未命中 key 都会返回并复用这个**同一个列表对象**——这不是“每次新建”,而是“统一复用”。常见症状是多个 key 对应的 list 互相污染。

用 lambda 或函数延迟构造默认值

把对象创建逻辑包进可调用对象里,让每次真正需要时才执行构造。最常用的是 lambda

data = {}
# 每次 key 不存在时,才执行 lambda() → 新建一个空 list
data.setdefault('a', lambda: []).call()  # ❌ 错!setdefault 不会自动调 lambda

所以不能直接传 lambdasetdefault。正确做法是手动检查 + 构造:

  • if key not in d: d[key] = []
  • 或封装成工具函数:def get_new_list(d, key): return d.setdefault(key, []) —— 这仍不解决问题

真正有效的写法是绕过 setdefault,改用 dict.get() + 赋值:

立即学习Python免费学习笔记(深入)”;

d = {}
val = d.get('items')
if val is None:
    val = []
    d['items'] = val

但更简洁的是用 collections.defaultdict,它天生支持“按需调用工厂函数”:

唱鸭
唱鸭

音乐创作全流程的AI自动作曲工具,集 AI 辅助作词、AI 自动作曲、编曲、混音于一体

下载
from collections import defaultdict
d = defaultdict(list)  # list 是类,每次调用 list() 得新实例
d['a'].append(1)
d['b'].append(2)  # d['a'] 和 d['b'] 是两个独立 list

如果必须用 setdefault,怎么安全传可变默认值?

唯一办法:把构造逻辑写成函数调用表达式,确保每次调用 setdefault 时都重新执行。例如:

  • d.setdefault('x', [].copy()) —— 但 [].copy() 总是返回新空列表,适合简单类型
  • d.setdefault('y', some_class()) —— 如果 some_class 是类名,每次调用都实例化新对象
  • d.setdefault('z', my_factory()) —— my_factory 必须是**函数调用**(带括号),不是函数名

错误示范:

  • d.setdefault('bad', list) —— 传的是类本身,不是调用结果,setdefault 会直接存 list 类对象
  • d.setdefault('worse', lambda: []) —— 存的是 lambda 函数对象,不是列表

defaultdictsetdefault 的本质区别在哪?

defaultdictdefault_factory 是在**内部缺失键访问时自动调用**的;而 setdefaultdefault 参数是**外部求值后传入的静态值**。这是根本差异,不是语法糖级别。

所以当你需要“每次都是全新对象”,且场景是高频、多 key、嵌套结构(比如 defaultdict(lambda: defaultdict(list))),defaultdict 不仅更安全,还更易读。硬用 setdefault 只会逼你写重复的 if not in … = … 检查逻辑。

容易被忽略的一点:如果默认值构造开销大(比如要读文件、连数据库),用 defaultdict 就可能误触发;这时反而得用显式的 if key not in d: d[key] = expensive_init(),把控制权完全收回来。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

775

2023.08.22

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

206

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

191

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

53

2026.01.05

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

206

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

191

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

53

2026.01.05

default gateway怎么配置
default gateway怎么配置

配置default gateway的步骤:1、了解网络环境;2、获取路由器IP地址;3、登录路由器管理界面;4、找到并配置WAN口设置;5、配置默认网关;6、保存设置并退出;7、检查网络连接是否正常。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.12.07

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

9

2026.01.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.3万人学习

Django 教程
Django 教程

共28课时 | 3.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号