这个元组语法是Python列表理解中的吗?如果不是,那是什么?

问题描述 投票:0回答:1

我在理解部分语法时遇到一些困难。特别是当元组需要括号

()
时。

例如下面这段代码:

c = {'a':10,'b':1,'c':22,'d':10}

tup = a,b = 4,5

print(a)
print(b)
print(tup)

newlist = [(x,y) for y,x in c.items()]

print(newlist)

此代码的输出是:

4
5
(4, 5)
[(10, 'a'), (1, 'b'), (22, 'c'), (10, 'd')]

当尝试从列表理解语句中的 x, y 中取出括号时,我得到了回溯。但是,此代码中的所有其他元组不需要需要括号。

我错过了什么?为什么 Python 将

a,b
理解为元组,而不是列表理解语句中的
x,y

在我看来,Python 与元组语法不一致。我尝试将括号取出并放回去以了解语法的工作原理。

python syntax tuples list-comprehension
1个回答
9
投票

需要括号来优先考虑运算符。考虑以下两行代码,它们的区别仅在于括号:

tup_a = 3, 4 + 10, 20
tup_b = (3, 4) + (10, 20)

第一行定义了一个由 3 个元素组成的元组

tup_a
(3, 14, 20)
。第二行定义了两个元组
(3, 4)
(10, 20)
,然后将它们连接成一个由四个元素组成的元组
(3, 4, 10, 20)

错误的括号很容易导致错误:

tup_c = 3, 4 * 10, 20
tup_d = (3, 4) * (10, 20)

第一行定义了一个包含 3 个元素的元组,

(3, 40, 20)
。第二行结果为
TypeError
,因为它定义了两个元组
(3, 4)
(10, 20)
,然后尝试将它们相乘,但乘法运算符
*
不知道如何处理元组。

您遇到了类似的问题。考虑以下几行代码:

x = 42
c = {'a': 10, 'b': 1, 'c': 22, 'd': 10}

l_a = [(x, y) for y,x in c.items()]  # [(10, 'a'), (1, 'b'), (22, 'c'), (10, 'd')]
l_b = [x, (y for y,x in c.items())]  # [42, <generator object>]
l_c = [x, y for y,x in c.items()]    # SyntaxError: invalid syntax

此代码正确定义了两个列表

l_a
l_b
,但在尝试定义
SyntaxError
时它会引发
l_c

Python 的设计者认为

l_c
的语法不明确,您应该添加括号来明确指定您是否与
l_a
l_b
表示相同的意思。

请注意,如果我在开始时没有添加

l_b
NameError: name 'x' is not defined
的代码行会引发
x = 42
,因为
x
中的角色与
l_b
中的角色不同。 l_a

© www.soinside.com 2019 - 2024. All rights reserved.