1

我有一个示例,其中 python 生成器表达式的迭代顺序似乎与类似的列表理解和生成器函数不同。

例如,代码

n = 10
d = {i : str(i) for i in range(n)}

for i in d:
    print d[i],
print

def func_gen(d):
    for i in range(n):
        yield d[i]

print(list(func_gen(d)))

g = [d[i] for i in range(n)]
print(g)

g = {d[i] for i in range(n)}
print(list(g))

有输出

0 1 2 3 4 5 6 7 8 9
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
['1', '0', '3', '2', '5', '4', '7', '6', '9', '8']

我希望生成器表达式产生一个有序的输出,就像它对列表理解所做的那样。生成器表达式是否有某些内容表明无法保证顺序?

为什么生成器表达式的顺序与其他表达式不同,即使构造几乎相同?它甚至与遍历字典的顺序不同,所以它似乎并没有推迟。

我在 Python 2 和 3 中看到了相同的行为。

4

1 回答 1

0

没有订购字典。您不能依赖他们的项目以任何特定的顺序返回,即使在函数调用之间也是如此。

于 2015-01-30T00:31:16.307 回答