Python 为什么不';我的列表元素没有被交换吗?

Python 为什么不';我的列表元素没有被交换吗?,python,Python,我想交换列表中的最小和最大元素。我的代码如下: A=[5,1,3,4,2] a=max(A) b=min(A) A[A.index(a)],A[A.index(b)]=A[A.index(b)],A[A.index(a)] print(A) #prints [5,1,3,4,2] 但是,当我写作时: A[0],A[1]=A[1],A[0] print(A) #prints [1,5,3,4,2] 如您所见,在第二种情况下,它显示了正确的输出。为什么不在第一种情况下?如果我们查看编译

我想交换列表中的最小和最大元素。我的代码如下:

A=[5,1,3,4,2]

a=max(A)
b=min(A)

A[A.index(a)],A[A.index(b)]=A[A.index(b)],A[A.index(a)]

print(A)  #prints [5,1,3,4,2]
但是,当我写作时:

A[0],A[1]=A[1],A[0]

print(A) #prints [1,5,3,4,2]

如您所见,在第二种情况下,它显示了正确的输出。为什么不在第一种情况下?

如果我们查看编译器使用dissasembler生成的指令:

>>> import dis
>>> dis.dis("A[A.index(a)],A[A.index(b)]=A[A.index(b)],A[A.index(a)]")
  1           0 LOAD_NAME                0 (A)
              2 LOAD_NAME                0 (A)
              4 LOAD_METHOD              1 (index)
              6 LOAD_NAME                2 (b)
              8 CALL_METHOD              1
             10 BINARY_SUBSCR
             12 LOAD_NAME                0 (A)
             14 LOAD_NAME                0 (A)
             16 LOAD_METHOD              1 (index)
             18 LOAD_NAME                3 (a)
             20 CALL_METHOD              1
             22 BINARY_SUBSCR
             24 ROT_TWO
             26 LOAD_NAME                0 (A)
             28 LOAD_NAME                0 (A)
             30 LOAD_METHOD              1 (index)
             32 LOAD_NAME                3 (a)
             34 CALL_METHOD              1
             36 STORE_SUBSCR
             38 LOAD_NAME                0 (A)
             40 LOAD_NAME                0 (A)
             42 LOAD_METHOD              1 (index)
             44 LOAD_NAME                2 (b)
             46 CALL_METHOD              1
             48 STORE_SUBSCR
             50 LOAD_CONST               0 (None)
             52 RETURN_VALUE
>>>
因此,首先,它计算
A[A.index(b)],A[A.index(A)]
,我们可以将部分计算语句视为:

A[A.index(a)], A[A.index(b)]= 1, 5
然后,正如你所看到的,第一部分

A[0] = 1
先完成,即

         26 LOAD_NAME                0 (A)
         28 LOAD_NAME                0 (A)
         30 LOAD_METHOD              1 (index)
         32 LOAD_NAME                3 (a)
         34 CALL_METHOD              1
         36 STORE_SUBSCR
因此,该清单包括:

[1, 1, 3, 4, 2]
那么最后一部分,

             38 LOAD_NAME                0 (A)
             40 LOAD_NAME                0 (A)
             42 LOAD_METHOD              1 (index)
             44 LOAD_NAME                2 (b)
             46 CALL_METHOD              1
             48 STORE_SUBSCR
但是在这一点上,
A.index(b)
0
!它确实:

A[0] = 5
然后你就到了你开始的地方。问题是,您修改了
A的位置。索引(b)
将以从左到右的顺序结束


。我想需要注意的重要一点是,首先计算右侧,然后依次计算左侧部分(可能由逗号分隔)。

如果您认为您的答案有用,您也可以将其用于链接的副本。(我可以看到,在现有的副本中,我能找到的答案没有一个使用
dis
。教人们使用
dis
来理解发生了什么不是一个坏主意,但如果可以的话,在语言规范中查找信息会更好)@user202729是的,我正在尝试在语言规范中找到一些澄清的东西。