在Python中生成时,"()"和"[]"之间有什么区别?

zfz*_*zfz 7 python tuples list generator

有一个列表:nodes = [20,21,22,23,24,25].

我使用两种方法来生成新的二维对象:

tour1 = (((a,b) for a in nodes )for b in nodes)
tour2 = [[(a,b) for a in nodes ]for b in nodes]
Run Code Online (Sandbox Code Playgroud)

tour1的类型是生成器,而tour2是列表:

In [34]: type(tour1)
Out[34]: <type 'generator'>

In [35]: type(tour2)
Out[35]: <type 'list'>
Run Code Online (Sandbox Code Playgroud)

我想知道为什么tour1不是一个元组?谢谢.

eca*_*mur 10

元组的语法不是括号(),而是逗号,.您可以创建一个没有括号的元组:

x = 1, 2, 3
Run Code Online (Sandbox Code Playgroud)

如果你想从理解中创建一个元组,只需使用tuple构造函数:

tuple(tuple((a,b) for a in nodes )for b in nodes)
Run Code Online (Sandbox Code Playgroud)


NPE*_*NPE 10

根本区别在于第一个是生成器表达式,第二个是列表推导.前者仅在需要时产生元素,而后者在运行理解时总是产生整个列表.

有关详细信息,请参阅生成器表达式与列表理解

在Python中没有"元组理解"这样的东西,这是你似乎期望从第一个语法.

如果你想tour1变成一个元组元组,你可以使用以下代码:

In [89]: tour1 = tuple(tuple((a,b) for a in nodes )for b in nodes)

In [90]: tour1
Out[90]: 
(((20, 20), (21, 20), (22, 20), (23, 20), (24, 20), (25, 20)),
 ((20, 21), (21, 21), (22, 21), (23, 21), (24, 21), (25, 21)),
 ((20, 22), (21, 22), (22, 22), (23, 22), (24, 22), (25, 22)),
 ((20, 23), (21, 23), (22, 23), (23, 23), (24, 23), (25, 23)),
 ((20, 24), (21, 24), (22, 24), (23, 24), (24, 24), (25, 24)),
 ((20, 25), (21, 25), (22, 25), (23, 25), (24, 25), (25, 25)))
Run Code Online (Sandbox Code Playgroud)


Jon*_*let 5

因为语法(x for x in l)是所谓的"生成器表达式":请参阅http://docs.python.org/2/reference/expressions.html#generator-expressions