当前位置: 首页 > news >正文

在PyCharm写Python字典:新手必避7大坑

前言

新手写字典,列表当键直接报错,查无此键程序崩溃,边遍历边删当场出错,默认值乱用结果变空,与is傻傻分不清,浅拷贝一改全改,自定义键无法查找。七个坑,步步惊心。
我也曾绊得踉跄、摔得生疼、绕得头晕——直到给键换元组,用get()防崩溃,删除前先存清单,用get()指定默认值,拿*
*判断是不是同一个,deepcopy复制彻底,给类加哈希功能和相等判断功能。七个招,豁然开朗。
本文三成速通语法,七成排雷避坑——用我的踩坑经验,带你避开8大坑,字典听你话。
如果你不会安装和使用Pycharm和Python.exe,请读以下两篇文章。
安装Pycharm+配置python.exe:0基础新手一次成功
如何使用PyCharm?0基础新手必看!七大核心功能+越用越有意思

字典基础语法速成

字典创建与基本结构

知识点:字典用{}创建,核心是键值对(键唯一),底层用哈希表实现,查找极快。实战案例如下,新手可以跟着敲。

# 通过创建字典,创建游戏角色属性卡super_hero={"name":"剑圣","HP":120,"攻击":35}print(super_hero["name"])# 输出: 剑圣

键值对增删改查

知识点:查用[],增/改直接赋值,删用del。键不存在时查会报错,增则新建。实战案例如下,新手可以跟着敲。

# 3秒修改购物车商品数量cart={"梨":3,"苹果":2}cart["梨"]=5# 改cart["香蕉"]=3# 增delcart["苹果"]# 删print(cart['梨'])# {'梨': 5} #查print(cart)# {'梨': 5, '香蕉': 3}

字典遍历

知识点:.keys()取键,.values()取值,.items()取键值对。遍历是操作字典的核心技能。实战案例如下,新手可以跟着敲。

# 学生成绩字典:姓名是键,分数是值scores={"小明":85,"小红":92}# .keys() 取所有键(学生姓名)names=scores.keys()print(f"学生名单:{list(names)}")# .values() 取所有值(分数)all_scores=scores.values()print(f"所有分数:{list(all_scores)}")# .items() 取键值对,遍历同时拿到姓名和分数forname,scoreinscores.items():# 判断等级:90分及以上为A,否则为Bifscore>=90:level="A"else:level="B"print(f"{name}:{level}")# 输出: 小明:B 小红:A

常用内置方法速查

知识点:.get()安全取值(无键返None或默认值),.keys()/values()/items()返回视图对象,可迭代。实战案例如下,新手可以跟着敲。

# 内置方法极简演示d={"a":1,"b":2}print(d.get("c","无"))# 安全取: 无print(list(d.keys()))# 所有键: ['a', 'b']print(list(d.values()))# 所有值: [1, 2]print(list(d.items()))# 键值对: [('a', 1), ('b', 2)]

排雷生存指南

坑1:可变对象当键

问题代码

# 列表是可变对象,不可哈希,用作键会报错name={[1,3]:'c'}

修正代码

# 改用不可变的元组当键name={(1,3):'c'}print(name[(1,3)])# 输出:c

总结

字典键必须是不可哈希(不可变)类型的,如元素。字典键是可哈希(可变)类型的(如列表)会报错。

坑2:键不存在硬取值

问题代码

user_infomation={'001':'李四'}print(user_infoation['003'])# 查询不存在的用户ID

修正代码

user_infomation={'001':'李四'}# 用get方法优雅处理,不存在返回默认值print(user_infomation.get('003','用户不存在'))# 输出:用户不存在

总结

直接用[]取值不存在会报错,用get()方法可指定默认值,来避免崩溃。

坑3:遍历中删元素

问题代码

good_orders={'001':'有效','002':'过期','003':'过期'}fornumberingood_orders:ifgood_orders[number]=='过期':delgood_orders[number]# 遍历中删除导致字典尺寸变化print(good_orders)

修正代码

good_orders={'001':'有效','002':'过期','003':'过期'}# 遍历键的副本,避免原字典尺寸变化fornumberinlist(good_orders.keys()):ifgood_orders[number]=='过期':delgood_orders[number]# 遍历中删除导致字典尺寸变化print(good_orders)

总结

遍历原字典删除元素时会报错,创建字典键的副本会安全地删除元素。

坑4:默认值的误用

问题代码

words_count={}words=['banana','apple','banana']forwordinwords:# get返回None时,+1会报错words_count[word]=words_count.get(word)+1print(words_count)

修正代码

words_count={}words=['banana','apple','banana']forwordinwords:# get指定默认值0,避免None参与运算words_count[word]=words_count.get(word,0)+1print(words_count)# 输出:{'apple': 2, 'banana': 1}

总结

get()默认返回none,无法直接参与运算。给get()指定合理默认值(如0)。

坑5:==与is混淆

问题代码

dict_1={'b':2}dict_2={'b':2}# 用is来判断(比较上述两字典的内存地址),误以为内容相同就相等print(dict_1isdict_2)# 输出:False

修正代码

dict_1={'b':2}dict_2={'b':2}# 用==判断内容是否相等print(dict_1==dict_2)# 输出:True

总结

用来比较内容,is是用来比较对象内存地址;内容相同的字典用**判断为 True,用is判断为 False。

坑6:浅拷贝的陷阱

问题代码

original_information={'user_infomation':{'name':'李四','age':19}}copy_information_dict=original_information.copy()# 浅拷贝仅仅复制表层copy_information_dict['user_infomation']['age']=25print(original_information['user_infomation']['age'])# 原件被修改了,输出:25

修正代码

importcopy original_information={'user_information':{'name':'李四','age':19}}# 深拷贝是来复制所有层级,互不影响deep_copy=copy.deepcopy(original_information)deep_copy['user_information']['age']=22print(original_information['user_information']['age'])# 输出:19

总结

浅拷贝是仅仅复制表层,修改嵌套对象会影响原字典,而深拷贝完全独立,没有此问题发生。

坑7:哈希碰撞的坑

问题代码

classUser:def__init__(self,user_id):self.user_id=user_id# 自定义类实例当键,默认哈希基于内存地址,导致缓存失效result={User(1):'数据1',User(1):'数据2'}print(len(result))# 输出:2(本该覆盖只存1个,却存了两个)

修正代码

classUser:def__init__(self,user_id):self.user_id=user_iddef__hash__(self):# 实现哈希方法returnhash(self.user_id)def__eq__(self,other):# 进行相等判断returnself.user_id==other.user_id result={User(1):'数据1',User(1):'数据2'}print(len(result))# 输出:1

总结

自定义类当键时,这需要实现__hash__和__eq__;否则因为哈希基于内存地址,所以缓存失效。

专栏下篇剧透:Python新手在PyCharm写while必踩5坑

专栏下篇剧透:《Python新手在PyCharm写while必踩5坑》。

如果你觉得本文有用,请动一动你宝贵的手指进行点赞、收藏、关注。我将持续更新PyCharm实战内容+Python基础语法痛点突破的干货,带你少走弯路。如果你有疑问,那就欢迎你在评论区留言。

http://www.gsyq.cn/news/1498198.html

相关文章:

  • Vue3+Vite实践 01
  • 2026年上海二手制冷设备回收指南:5大专业服务商深度横评 - 年度推荐企业名录
  • 展锐平台摄像头点亮bringup
  • 啶虫脒农药残留检测卡快速检测果蔬中的啶虫脒农药残留
  • 2026年钢丝绳厂家十大品牌榜单:吊装钢丝绳/进口德国迪帕钢丝绳/电梯钢丝绳/起重钢丝绳/船用钢丝绳/港口起重机与塔吊钢丝绳优质厂家推荐 - 品牌发掘
  • Qt + FFmpeg 实战:将音视频文件解码为 PCM 数据
  • 12.linux笔记:线程
  • 【资源下载】一款免费驱动,告别付费
  • 靠谱工业冷水机怎么挑?从资质、技术到工况全维度解析 - 信息热点
  • 湖北孝感青少年封闭管教中心|孩子叛逆/网瘾/厌学/夜不归宿怎么教育|心理特教团队重塑阳光少年 - 辛云教育资讯
  • 优利德数字示波器代理商怎么选?价格最低≠最划算,这篇说透了 - 品牌推荐大师
  • 告别熬夜凑论文!paperxie 课程论文 AI 写作,一键解锁高效出稿新方式
  • .NET 领域驱动设计:用户角色更新如何从应用服务落地到领域实体(代码拆解)
  • 手把手教你快速判断搬家公司是否靠谱,为什么北京利康鸿运值得信赖? - 资讯纵览
  • N100软路由(一) 知己知彼--搞懂你家网络到底在干什么
  • 寄快递怎么便宜些?这几招帮你省一半运费 - 快递物流资讯
  • 2026年车库门彩涂卷厂家深度测评:如何为你的车库门项目匹配最佳方案? - 热点速览
  • 参加深信服SF-Fastgpt培训小结
  • 绿色积分不是骗局,是太多人把它用成了骗局
  • FinalShell保存的密码安全吗?一个Java脚本带你解密本地存储机制
  • Verilog代码整洁之道:用VSCode+verilog-format打造你的专属格式化工作流
  • 2026新西兰三类签证代办成功率解析:专业服务的核心逻辑 - 奔跑123
  • 2026年广西大邦教育科技有限公司职称助评公司推荐:中级职称/高级职称全流程服务精选 - 品牌推荐官
  • 在 Fly.io 上使用 Rust 构建远程开发环境:从 Tokio 到 eBPF
  • 贵州刺梨饮品代工厂家怎么选?2026年源头工厂与全国招商加盟平台深度对标 - 年度推荐企业名录
  • 网络小白也能玩转eNSP:手把手教你搭建一个能上网的‘虚拟公司’网络
  • Redis 分布式锁进阶第一百三十篇
  • 2026年6月最新|实验室金相磨抛机厂家推荐哪家好TOP榜:兼顾精度与效率,新手也能直接抄作业 - 商业新知
  • 别再踩坑了!Windows 10/11 本地搭建 SonarQube 8.9 代码质量平台保姆级教程
  • 2026贵阳山庄烧烤推荐指南:筑箐苑山庄性价比之选与近郊度假一站式方案 - 企业名录优选推荐