我的代码中的操作顺序好像不对...
numbers=[7, 6, 4]
result = 1
for num in numbers:
result *= num - 3
print(result)
在这段代码中,我预计会发生以下情况...
result=1
result = 1 * 7 - 3 = 7 - 3 = 4
result = 4 * 6 - 3 = 24 - 3 = 21
result = 21 * 4 - 3 = 84 - 3 = 81
然而,运行程序输出
结果= 1
结果= 1 * 7 - 3 = 1 * 4 = 4
结果= 4 * 6 - 3 = 4 * 3 = 12
结果= 12 * 4 - 3 = 12 * 1 = 12
Why with the *= operator is the order of operations altered?
My understanding is it does not have any special properties it merely saves space instead of writing:
result = result * num - 3
we get
result *= num - 3
and for some reason.. (result = result * num - 3) != (result *= num - 3)
4条答案
按热度按时间nnt7mjpx1#
为什么使用 *=操作符会改变操作顺序?
以下标记是运算符:
以下标记用作语法中的分隔符:
句点也可以出现在浮点型和虚型文本中。三个句点的序列作为省略号文本具有特殊的含义。列表的后半部分,即扩充赋值运算符,在词法上用作分隔符,但也执行运算。
此外,在您的代码中,您有增强赋值语句,如"7.2.1.增强赋值语句"所示:
[...]
扩充赋值语句计算目标(与普通赋值语句不同,它不能是解包)和表达式列表,对两个操作数执行特定于赋值类型的二元运算,并将结果赋给原始目标。目标只计算一次。
与普通赋值不同,增广赋值在计算右边之前先计算左边。例如,a [i]+= f(x)首先查找a [i],然后计算f(x)并执行加法,最后将结果写回到a [i]。
"6.16.评估令"规定:
Python从左到右计算表达式,注意,当计算赋值时,右边的赋值先于左边的赋值。
您也可以查看"6.17.运算符优先级"一章,但它与语句无关。
y0u0uwnf2#
*=
右侧的表达式被求值为 first。7 - 3
=〉4
乘以1
等于4
。6 - 3
=〉3
乘以4
等于12
。4 - 3
=〉1
乘以12
等于12
。为了达到您的期望:
9rnv2umw3#
运算符是复合赋值运算符,这意味着它将赋值运算符=与另一个运算符https://www.educative.io/answers/what-are-the-compound-assignment-identity-operators-in-python组合在一起
20jt8wwn4#