操作顺序Python

2ic8powd  于 2022-12-28  发布在  Python
关注(0)|答案(4)|浏览(185)

我的代码中的操作顺序好像不对...

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)
nnt7mjpx

nnt7mjpx1#

为什么使用 *=操作符会改变操作顺序?

  • =不是运算符,而是分隔符。请检查"Python语言参考"的"2.词法分析":

以下标记是运算符:

+       -       *       **      /       //      %      @
<<      >>      &       |       ^       ~       :=
<       >       <=      >=      ==      !=

以下标记用作语法中的分隔符:

(       )       [       ]       {       }
,       :       .       ;       @       =       ->
+=      -=      *=      /=      //=     %=      @=
&=      |=      ^=      >>=     <<=     **=

句点也可以出现在浮点型和虚型文本中。三个句点的序列作为省略号文本具有特殊的含义。列表的后半部分,即扩充赋值运算符,在词法上用作分隔符,但也执行运算。
此外,在您的代码中,您有增强赋值语句,如"7.2.1.增强赋值语句"所示:

    • 增强赋值是在单个语句中组合二元运算和赋值语句**:

[...]
扩充赋值语句计算目标(与普通赋值语句不同,它不能是解包)和表达式列表,对两个操作数执行特定于赋值类型的二元运算,并将结果赋给原始目标。目标只计算一次。

    • 像x += 1这样的扩展赋值表达式可以重写为x = x +1,以达到类似但不完全相同的效果。**在扩展版本中,x只计算一次。此外,如果可能,实际操作就地执行,这意味着不是创建新对象并将其赋值给目标,而是修改旧对象。

与普通赋值不同,增广赋值在计算右边之前先计算左边。例如,a [i]+= f(x)首先查找a [i],然后计算f(x)并执行加法,最后将结果写回到a [i]。
"6.16.评估令"规定:
Python从左到右计算表达式,注意,当计算赋值时,右边的赋值先于左边的赋值。
您也可以查看"6.17.运算符优先级"一章,但它与语句无关。

y0u0uwnf

y0u0uwnf2#

*=右侧的表达式被求值为 first
7 - 3 =〉4乘以1等于4
6 - 3 =〉3乘以4等于12
4 - 3 =〉1乘以12等于12
为了达到您的期望:

numbers = [7, 6, 4]
result = 1
for num in numbers:
    result = result * num - 3
    print(result)
9rnv2umw

9rnv2umw3#

numbers=[7, 6, 4] 
result = 1 
for num in numbers: 
    result *= num-3   
print(result)

运算符是复合赋值运算符,这意味着它将赋值运算符=与另一个运算符https://www.educative.io/answers/what-are-the-compound-assignment-identity-operators-in-python组合在一起

numbers=[7, 6, 4] 
result = 1 
for num in numbers: 
    result = result*num-3
    print(result)
20jt8wwn

20jt8wwn4#

  • =意味着 * 将被用在它前面的内容和后面的内容之间,所以在这个例子中,你需要得到result_2来得到你想要的:
numbers = [7,6,4]
result = 1 
result_2 = 1 
for number in numbers:
    result *= number -3 
    result_2  = result_2 * number -3
    print(result, result_2)

相关问题