gpt4 book ai didi

python - 为什么我的列表元素没有被交换?

转载 作者:行者123 更新时间:2023-12-03 14:36:25 34 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Tuple unpacking order changes values assigned

(4 个回答)



Python Tuple Assignment involving list index failed [duplicate]

(3 个回答)


6 个月前关闭。




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

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]
如您所见,在第二种情况下,它显示了正确的输出。为什么不是第一种情况?

最佳答案

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

>>> 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.index(b) 结束的位置,因为它是从左到右依次发生的。
Here is a reference to the documentation for assignment statements in the language spec。我想需要注意的重要一点是首先评估右侧,然后按顺序对左侧的部分(可能用逗号分隔)进行评估。

关于python - 为什么我的列表元素没有被交换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66309687/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com