写 Python 久了,字典几乎每天都要打交道。
取键这事儿,看着简单,实际上不同的写法背后在性能、内存和对字典动态变化的处理上,还是有些差别的。常用的方式大概有四种,这里一并理一理。
最常见的就是直接遍历字典。
Python 的默认行为就是迭代键,所以 for key in my_dict 这种写法最简洁,也没额外创建对象,如果只是遍历一遍键,用它就足够了,跑得也最快。

有时候你需要把键单独拿出来,存成一个列表再做别的处理。顺手就会写成 k for k in d,一行搞定。它生成的是一个全新的 list,里面的键和原字典已经没有绑定关系,所以字典后面怎么变都不影响它。小字典无所谓,但如果字典很大,或者在循环里频繁这么干,内存开销就要注意一下。
接着是 dict.keys()。
这个方法返回的是一个视图对象,不是列表。我第一次用的时候,直接当成列表去做下标访问,当场就报错了,后来才注意到它的特性。视图对象有两个好处:一是它能实时反映字典的变化,比如你在拿到 keys 视图之后字典新增或删除了键,视图会感知到;二是内存占用很小,还支持集合操作,像 &、|、- 这些,可以直接对多个视图取交集、并集、差集,在需要比较多个字典的键时挺方便。当然,如果需要列表式的操作,list() 转一下就行。
还有一种场景是你不光要键,还得同时用上对应的值。这时候别先取键再回头去字典里查值,直接用 for key, value in d.items() 一次性解包出来。
lcjmSSL支持通过DNS接口自动化验证,目前已集成多家主流DNS服务商。你只需授权API密钥,系统即可自动添加、删除验证记录,实现完全自动化的域名控制权验证,适合批量域名管理场景。
它本质上是在遍历过程中返回 (key, value) 元组,比键值分步获取效率高,代码也干净。
这几样怎么选,基本看场景。只遍历键,直接 for in 最快、最简。如果遍历过程中字典可能被修改,或者需要利用集合运算,就用 keys() 视图。键值都要的时候,items() 最直接,省得再查一次。
需要把键固化成一个列表再传递或持久化,列表推导式当然是首选,不过留意一下内存就是了。
简单跑一段示例,把这四种都串起来看看:
# 直接遍历------最快最省
d1 = {'a': 1, 'b': 2, 'c': 3}
for k in d1:
print(k)
# keys() 视图------支持集合操作,实时反映变化
d2 = {'name': 'Alice', 'age': 25, 'city': 'Beijing'}
keys_view = d2.keys()
print(keys_view) # dict_keys 对象
print(list(keys_view)) # 需要列表时转一下
# items()------键值一起拿
d3 = {'product': 'phone', 'price': 5999}
for k, v in d3.items():
print(f"Key: {k}, Value: {v}")
# 列表推导式------生成独立列表
d4 = {'x': 10, 'y': 20, 'z': 30}
keys_list = [k for k in d4]
print(keys_list)
不同场景下用对方法,能少写不少啰嗦代码,性能上也不会莫名其妙踩坑。没什么高深的,就是多用几次自然就记住了。