You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 2.7生成器解包字典的输出结果疑问

嘿,这个问题挺有代表性的,正好我对Python 2.7里字典的行为门儿清,来给你掰扯明白:

首先看你贴的这段代码:

def g1():
    d = {'a':1, 'b':2, 'c':3}
    yield d
for a,b,c in g1():
    print a,b,c

第一个疑问:为什么输出是a c b而不是预期的a b c?

这得从Python 2.7字典的底层实现说起——Python 2.7的字典是不保证键的迭代顺序和插入顺序一致的!字典里的键是根据它们的哈希值来存储的,迭代的时候会按照哈希值对应的槽位顺序来返回键,而不是你定义字典时写的顺序。

你代码里的g1()函数yield的是整个字典对象,然后for a,b,c in g1()其实是对这个字典进行拆包操作:把字典迭代出来的所有键一次性分配给a、b、c三个变量。而你的字典刚好有3个键,所以能成功拆包,但顺序完全由字典内部的哈希存储逻辑决定,碰巧在你的环境里迭代顺序是'a'、'c'、'b',所以输出就是a c b。

第二个疑问:如果直接写d = {'a':1, 'b':2, 'c':3},然后执行for a,b,c in d:会怎么样?

这里要注意:直接迭代字典的时候,循环每次只会取出一个键。比如第一次循环会拿到'a'(或者其他顺序的键),然后试图把这个单个字符串拆包给a、b、c三个变量——这显然做不到,因为一个长度为1的字符串没法分成3个元素。运行这段代码会直接抛出ValueError: need more than 1 value to unpack的错误,根本没法正常执行下去。

顺便提一句,这种“键顺序不确定”的问题在Python 3.7之后就解决了,从3.7开始字典会严格保留插入顺序,但Python 2.7早就停止维护了,遇到这种老版本的奇怪行为也很正常~

内容的提问来源于stack exchange,提问作者yulunz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:12:23