我想知道为什么会发生以下情况。
下面的代码首先评估右侧1**3
,然后评估2**1
2**1**3 has the value of 2
但是,对于下面的代码,首先评估左侧的7//3
,然后评估2*3
。最后1+6-1=6
。
1+7//3*3-1 has the value of 6
答案 0 :(得分:3)
看看documentation of operator precedence。尽管乘法*
和底除//
的优先级相同,但是您应该注意这一部分:
同一框中的运算符从左到右分组(除幂运算,从右到左分组)。
关于2 1 3 的约定被评估为右关联,请参见数学stackexchange网站上的跨站点重复:What is the order when doing xyz and why?
TL; DR是这样的:由于左关联版本(x y ) z 等于x y * z ,对同一件事使用另一个(更差的)表示法是没有用的,因此求幂应该是正确的关联。
答案 1 :(得分:2)
几乎所有所有运算符(具有相同的优先级)具有从左到右的关联性。例如:
1 / 2 / 3 ≡ (1 / 2) / 3
一个例外是指数运算符,它是从右到左的关联性:
2 ** 3 ** 4 ≡ 2 ** (3 ** 4)
这就是language is defined的方式,与abc ≡ a(bc)
的数学符号匹配。
如果它是(ab)c
,那将是abc
。
答案 2 :(得分:1)
对于每个Operator Precedence,运算符是右关联的:a**b**c**d == a**(b**(c**d))
。
因此,如果您这样做:
a,b,c,d = 2,3,5,7
a**b**c**d == a**(b**(c**d))
一段时间后,您应该会成真。
答案 3 :(得分:0)
python中的指数运算符具有右至左个优先级。在表达式中所有出现的事件中,计算将从最右到最左进行。指数算子是所有其他算子中的一个例外,因为它们大多数遵循从左到右的关联规则。
2**1**3 = 2
表达式
1+7//3*3-1
这是从左到右关联的简单情况。由于 // 和*运算符具有相同的优先级,因此考虑了关联性(一个为左)。
答案 4 :(得分:0)
这就是数学通常的工作方式
2 1 3
这与您使用的第一个表达式相同。要使用数学方法对此进行评估,您需要逐步降低,因此1 3 = 1,然后2 1 等于2。
答案 5 :(得分:0)
您只需考虑数学中经典的PEMDAS(或请打扰我亲爱的萨莉姨妈)的顺序就可以理解这一点。在您的第一个中,2**1**3
等效于,它实际上读作。以这种方式查看,您会发现首先进行括号(P)(1**3
)。
在第二个1+7//3*3-1 == 6
中,您必须注意,PEMDAS的MD和AS实际上是按照从左到右先读的顺序进行的。只是语言的错误,我们必须先写一个字母(也就是说,我们可以将其写为PEDMAS,但如果我们适当地对待D和M,这仍然是正确的)。
总而言之,即使Python是用笔和纸写的,Python也会像对待数学一样对待数学。