我是Python的新手,我还在学习。在使用运算符时,我已经学习了左侧绑定的概念(并且被教导只有求幂才使用右侧绑定)。我还学到,*
和/
具有相同的优先级,运算符的绑定决定了一些具有相同优先级的运算符执行的计算顺序,将它们并排放在一个表达式中。
但现在,在教授复合赋值运算符时,他们使用了以下示例
a = 6
b = 3
a /= 2 * b
print(a)
给出的答案是1.0
。
他们给出的解释如下。
2*b=6
A=6→6/6= 1.0
我的问题是,a/=2*b
不是和a=a/2*b
是一样的吗?因此,当考虑a=a/2*b
时,不应该首先考虑除法,因为左侧绑定,然后是乘法。
A=6→6/2 = 3.0
3.0 *b= 9.0。
那么,9.0
不应该是答案吗?请给我解释一下。
发布于 2021-05-17 11:24:30
语句a /= 2 * b
等同于a /= (2 * b)
,而不是(a /= 2) * b
,后者在Python语言中没有意义。
如果您确实将其解释为(a /= 2) * b
,那么它将扩展为(a = a / 2) * b
,而不是a = (a / 2) * b
。这在Python中是不允许的,因为a = a / 2
不是一个表达式,并且它不会产生一个可以与b
相乘的值。
答案是赋值运算符_ = _
和_ /= _
等增强赋值运算符的优先级低于其他运算符(如_ * _
和_ / _
),并且它们在语法上是“右关联”的,因此a = b = c
将结果c
同时赋值给a
和b
;然而,将其等同于a = (b = c)
是不正确的,因为由于上述原因,这在Python语言中没有意义。尽管如此,_ ** _
并不是Python中唯一的右关联运算符:另一个是三元运算符_ if _ else _
,其中表达式a if b else c if d else e
等同于a if b else (c if d else e)
,而不是(a if b else c) if d else e
。
发布于 2021-05-17 11:26:38
Python遵循数学中常用的操作顺序,其中指数优先于乘法/除法,而指数又高于加法/减法。复合运算符是此顺序中的最后一个。因此,在您的示例中,首先计算2*b并返回6,然后计算a/=6并返回1。
https://stackoverflow.com/questions/67563590
复制相似问题