如何有条件地从一个值中减去

Mar*_*itt 0 python

我正在运行 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)

除非有什么明显的东西我只是想念?为什么它甚至试图评估 -= 如果它落入其他?

Car*_*ate 5

这被分组为:

(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),然后尝试减去产生Nonex