我在理解部分语法时遇到一些困难。特别是当元组需要括号
()
时。
例如下面这段代码:
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 与元组语法不一致。我尝试将括号取出并放回去以了解语法的工作原理。
需要括号来优先考虑运算符。考虑以下两行代码,它们的区别仅在于括号:
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
。