使用 python 的 ** 运算符和 * 运算符时签名
sign while using python's ** operator and * operator
>>> -5**4
-625
>>> -5*-5*-5*-5
625
即使我们在做同样的事情,也存在符号问题。谁能解释为什么会这样?
根据 Operator precedence table,一元否定的优先级低于 **
运算符。这就是为什么先计算 5**4
然后应用一元取反。
因此,表达式 -5**4
的计算结果为 -(5 ** 4)
,即 -(625)
.
相反,先计算 -5
,然后应用求幂 (**
) 运算符,您将得到预期的结果
>>> -5**4
-625
>>> (-5)**4
625
要查看内部实际发生的情况,您可以将表达式拆分为两部分。将4
赋值给一个变量并在表达式中使用它然后反汇编字节码
>>> dis(compile('a=4;-5**a', 'string', 'exec'))
1 0 LOAD_CONST 0 (4)
3 STORE_NAME 0 (a)
6 LOAD_CONST 1 (5)
9 LOAD_NAME 0 (a)
12 BINARY_POWER
13 UNARY_NEGATIVE
14 POP_TOP
15 LOAD_CONST 2 (None)
18 RETURN_VALUE
正如我们在这里看到的,首先 5
和变量 a
的值用于 BINARY_POWER
操作,UNARY_NEGATIVE
应用于其结果。
但是当你先计算 -5
时,
>>> dis(compile('a=4;(-5)**a', 'string', 'exec'))
1 0 LOAD_CONST 0 (4)
3 STORE_NAME 0 (a)
6 LOAD_CONST 1 (-5)
9 LOAD_NAME 0 (a)
12 BINARY_POWER
13 POP_TOP
14 LOAD_CONST 2 (None)
17 RETURN_VALUE
BINARY_POWER
操作在 -5
和变量 a
的值上完成。
>>> -5**4
-625
>>> -5*-5*-5*-5
625
即使我们在做同样的事情,也存在符号问题。谁能解释为什么会这样?
根据 Operator precedence table,一元否定的优先级低于 **
运算符。这就是为什么先计算 5**4
然后应用一元取反。
因此,表达式 -5**4
的计算结果为 -(5 ** 4)
,即 -(625)
.
相反,先计算 -5
,然后应用求幂 (**
) 运算符,您将得到预期的结果
>>> -5**4
-625
>>> (-5)**4
625
要查看内部实际发生的情况,您可以将表达式拆分为两部分。将4
赋值给一个变量并在表达式中使用它然后反汇编字节码
>>> dis(compile('a=4;-5**a', 'string', 'exec'))
1 0 LOAD_CONST 0 (4)
3 STORE_NAME 0 (a)
6 LOAD_CONST 1 (5)
9 LOAD_NAME 0 (a)
12 BINARY_POWER
13 UNARY_NEGATIVE
14 POP_TOP
15 LOAD_CONST 2 (None)
18 RETURN_VALUE
正如我们在这里看到的,首先 5
和变量 a
的值用于 BINARY_POWER
操作,UNARY_NEGATIVE
应用于其结果。
但是当你先计算 -5
时,
>>> dis(compile('a=4;(-5)**a', 'string', 'exec'))
1 0 LOAD_CONST 0 (4)
3 STORE_NAME 0 (a)
6 LOAD_CONST 1 (-5)
9 LOAD_NAME 0 (a)
12 BINARY_POWER
13 POP_TOP
14 LOAD_CONST 2 (None)
17 RETURN_VALUE
BINARY_POWER
操作在 -5
和变量 a
的值上完成。