python - 使用 python 的 ** 运算符和 * 运算符时进行签名

标签 python python-2.7 math sign

>>> -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 code> 应用于其结果。

但是当您首先评估 -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 的值上完成的。

关于python - 使用 python 的 ** 运算符和 * 运算符时进行签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33314668/

相关文章:

python - 如何获取 Django 模型中两个字段的乘积

python - 混合文件和循环

python - 编写一个返回反转数字的函数

c++ - 帮助解决这个问题

python - 非常奇怪的 numpy 数组浮点行为

python - PDB - 在交互模式下设置或更改变量

python - ASCII 上更快的几何平均数

python - 在 python 2.7 中导入 nltk 的语法无效

javascript - 为什么我的脚本中会遇到这个 if 语句? JS

java - Android 除法始终结果为 0