为什么使用列表推导式创建元组列表需要括号?

Isa*_* To 8 python python-3.x

函数式编程 HOWTO 中所述,要使用列表推导式创建元组列表,必须使用括号。特别是,这在以下引用的文档中有所表达。

为了避免在 Python 的语法中引入歧义,如果表达式 正在创建一个元组,它必须用括号括起来。

因此,例如:

[x, y for x in seq1 for y in seq2]  # This is a syntex error
[(x, y) for x in seq1 for y in seq2]  # This is a correct expression of list of tuples using list comprehension
Run Code Online (Sandbox Code Playgroud)

通过强制使用括号来表达使用列表推导式的元组列表可以避免什么歧义?

use*_*ica 9

经过大量的邮件列表挖掘,我发现了一个非常明确的声明,即解析器可以很好地处理它。括号是强制性的,以使含义更清楚。这是2000 年 Guido 在 python-dev 邮件列表中的引用

别担心。Greg Ewing 用 Python 自己的语法表达这一点没有问题,这与解析器一样受到限制。(它是 LL(1),相当于带有一个前瞻标记的纯递归下降,即没有回溯。)

这是 Greg 的语法:

atom: ... | '[' [testlist [list_iter]] ']' | ...
  list_iter: list_for | list_if
  list_for: 'for' exprlist 'in' testlist [list_iter]
  list_if: 'if' test [list_iter]
Run Code Online (Sandbox Code Playgroud)

请注意,之前的列表语法是'[' [testlist] ']'. 让我用不同的术语来解释它:

解析器解析一系列以逗号分隔的表达式。以前,它希望']'成为此后唯一可能的令牌。更改后,'for'是另一个可能的后续令牌。对于任何知道如何解析匹配括号的解析器来说,这根本不是问题!

如果你不想支持,[x, y for ...]因为它是模棱两可的(对于人类读者,而不是解析器!),我们可以将语法更改为:

'[' test [',' testlist | list_iter] ']'
Run Code Online (Sandbox Code Playgroud)

(注意|绑定小于连接,[...]表示可选部分。)

另请参阅线程中的下一个响应,其中 Greg Ewing 运行

>>> seq = [1,2,3,4,5]
>>> [x, x*2 for x in seq]
[(1, 2), (2, 4), (3, 6), (4, 8), (5, 10)]
Run Code Online (Sandbox Code Playgroud)

在列表理解补丁的早期版本上,它工作得很好。


pro*_*365 -1

来自文档

如您所见,输出元组始终括在括号中,以便正确解释嵌套元组;它们可以带或不带括号输入,尽管通常括号是必需的(如果元组是较大表达式的一部分)。不可能分配给元组的各个项目,但是可以创建包含可变对象的元组,例如列表。

在列表理解中,元组嵌套在列表中。因此它们必须用括号括起来。但是当不嵌套时,例如the_tuples = 'a','b','c'它们是不必要的,因为它们会被自动识别为元组。