我正在运行 Python 3.7.4,并且在处理某些事情时发现了一些不良行为,然后我将其简化为:
>>> x = 5
>>> x -= 1 if False else print("blah")
blah
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -=: 'int' and 'NoneType'
Run Code Online (Sandbox Code Playgroud)
除非有什么明显的东西我只是想念?为什么它甚至试图评估 -= 如果它落入其他?
这被分组为:
(x) -= (1 if False else print("blah"))
Run Code Online (Sandbox Code Playgroud)
不是:
(x -= 1) if False else (print("blah"))
Run Code Online (Sandbox Code Playgroud)
尽管since-=和其他赋值语句本身不求值,但它们不能作为条件表达式的一部分出现。赋值的左侧和右侧参数分别计算,然后分配给左侧参数:
增广赋值评估目标 [
x] 。. . 和表达式列表[1 if False else print("blah")],对两个操作数[-]执行特定于赋值类型的二元运算,并将结果赋值给原始目标。
右边的计算结果为条件表达式None(因为print回报率None),然后尝试减去产生None的x。