Python 解包生成字典的生成器

Python 解包生成字典的生成器,python,python-2.7,generator,iterable-unpacking,Python,Python 2.7,Generator,Iterable Unpacking,我无法理解以下示例代码的输出: def g1(): d = {'a':1, 'b':2, 'c':3} yield d for a,b,c in g1(): print a,b,c 在Python2.7.14中,上述内容将打印出来 a c b 这种行为有两个有趣的方面: 它打印出排序后的abc的acb整数,这应该是这样的,因为我们讨论的是字典键 如果只定义字典而不编写生成器d={'a':1,'b':2,'c':3},然后在d:中为a,b,c编写,这将是一个值错误 1

我无法理解以下示例代码的输出:

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

for a,b,c in g1():
    print a,b,c
在Python2.7.14中,上述内容将打印出来

a c b
这种行为有两个有趣的方面:

  • 它打印出排序后的
    abc
    acb
    整数,这应该是这样的,因为我们讨论的是字典键
  • 如果只定义字典而不编写生成器
    d={'a':1,'b':2,'c':3}
    ,然后在d:中为a,b,c编写
    ,这将是一个值错误
  • 1.)在Python2.7中,字典是无序的


    2.
    对于d中的a、b、c:
    将给您一个错误,因为您试图将字典中的键解压为三个变量,这是行不通的。但是,您可以对d.items()中的a、b执行
    ,因为它返回一个元组对列表。

    第一点:在Python2.7中,dict根本没有顺序。在3.7+之前不要依赖它

    第二点:生成器
    g1()
    在迭代时生成字典。拟议的备选方案:

    for a,b,c in d:
        ...
    
    是苹果对橙子,这是字典本身的迭代。对于要在此处解包的等效duck,您需要一个在迭代时返回字典的对象:


    科林的回答基本上回答了你的问题。但是,如果您想解决无序列表的第一个问题,请尝试使用
    集合
    库下的内置类
    OrderedDict

    字典在Python中不排序。无论如何,在Python 2.7中也不排序。键按插入顺序返回,作为3.6中的CPython实现细节,并将作为从3.7开始的语言保证。这意味着
    a,b,c=d
    ,其中
    d
    是如上定义的字典,将是一项法律声明,将
    d
    的键分配给变量
    a
    b
    ,和
    c
    。如果
    d
    是一个列表,则行为类似。这对我来说是个惊喜。
    for a,b,c in [d]:
        ...