gpt4 book ai didi

python - 如何在 python 中使用 list[list.index ('' )] 查询

转载 作者:太空狗 更新时间:2023-10-29 21:18:38 26 4
gpt4 key购买 nike

我在 python IDLE 中尝试了以下代码。但是我好像没发现元素调换了。

>>> a = [1,2,3,4,5,6,7]
>>> if(a.index(2)<a.index(4)):
... a[a.index(2)],a[a.index(4)] = a[a.index(4)],a[a.index(2)]

根据代码,应该把2和4的位置调反了,错了请指正。

最佳答案

赋值列表表达式在赋值时从左到右求值。

这是发生了什么:

  • 右侧表达式的计算结果为 (4, 2)
  • a[a.index(2)] 被赋值给 4a[2] 被改变,列表变成[1, 4, 3, 4, 5, 6, 7]
  • a[a.index(4)] 被评估为将 2 分配给,a[2] 被再次更改 因为现在是第一个位置 4 回到 [1, 2, 3, 4, 5, 6, 7]

您可以在反汇编的 Python 字节码中看到这一点:

>>> def foo():
... a = [1,2,3,4,5,6,7]
... a[a.index(2)],a[a.index(4)] = a[a.index(4)],a[a.index(2)]
...
>>> import dis
>>> dis.dis(foo)
2 0 LOAD_CONST 1 (1)
3 LOAD_CONST 2 (2)
6 LOAD_CONST 3 (3)
9 LOAD_CONST 4 (4)
12 LOAD_CONST 5 (5)
15 LOAD_CONST 6 (6)
18 LOAD_CONST 7 (7)
21 BUILD_LIST 7
24 STORE_FAST 0 (a)

3 27 LOAD_FAST 0 (a)
30 LOAD_FAST 0 (a)
33 LOAD_ATTR 0 (index)
36 LOAD_CONST 4 (4)
39 CALL_FUNCTION 1
42 BINARY_SUBSCR
43 LOAD_FAST 0 (a)
46 LOAD_FAST 0 (a)
49 LOAD_ATTR 0 (index)
52 LOAD_CONST 2 (2)
55 CALL_FUNCTION 1
58 BINARY_SUBSCR
59 ROT_TWO
60 LOAD_FAST 0 (a)
63 LOAD_FAST 0 (a)
66 LOAD_ATTR 0 (index)
69 LOAD_CONST 2 (2)
72 CALL_FUNCTION 1
75 STORE_SUBSCR
76 LOAD_FAST 0 (a)
79 LOAD_FAST 0 (a)
82 LOAD_ATTR 0 (index)
85 LOAD_CONST 4 (4)
88 CALL_FUNCTION 1
91 STORE_SUBSCR
92 LOAD_CONST 0 (None)
95 RETURN_VALUE

通过指令索引 59,Python 计算了右侧表达式;接下来是作业。可以看到a.index(2)(63-72)先求值,然后STORE_SUBSCR4,只有< em>然后 a.index(4) 被评估(指令 79-85)。

解决方法是为每个值调用 .index() 一次,并将索引存储在变量中:

index_two, index_four = a.index(2), a.index(4)
if index_two < index_four:
a[index_two], a[index_four] = a[index_four], a[index_two]

关于python - 如何在 python 中使用 list[list.index ('' )] 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17125390/

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