Python,数组在迭代一次后不会改变(交换)

Python,数组在迭代一次后不会改变(交换),python,arrays,Python,Arrays,我想解决一个问题, 但是当我调试时,我发现数组的值在一次之后不会改变。 在这短短的5行代码中,我是否做错了什么?? 提前谢谢你的回答 a = [1, 2, 3, 4, 5] for i in range(5): b, c = map(int, input().split()) a[a.index(b)], a[a.index(c)] = a[a.index(c)], a[a.index(b)] print(a) 输入示例: 5 4 1 2 3 4 1 4 2 2 预期

我想解决一个问题, 但是当我调试时,我发现数组的值在一次之后不会改变。 在这短短的5行代码中,我是否做错了什么?? 提前谢谢你的回答

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

for i in range(5):  
    b, c = map(int, input().split())
    a[a.index(b)], a[a.index(c)] = a[a.index(c)], a[a.index(b)]

print(a)
输入示例:

5 4
1 2
3 4
1 4
2 2
预期产出:

3 1 4 2 5
我的输出:

1 2 3 5 4
您可以使用:

for i in range(5):  
    b, c = map(int, input().split())
    b_index = a.index(b)
    c_index = a.index(c)
    a[b_index], a[c_index] = a[c_index], a[b_index]

下面是一段代码,用于理解该行为:

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

def get_index(i, s):
    idx = a.index(i)
    print(s, i, idx)
    return idx

a[get_index(1, 'left')], a[get_index(2, 'left')] = a[get_index(2, 'right')], a[get_index(1, 'right')]
print(a)
输出:

right 2 1
[1, 2, 3, 4, 5]
right 1 0
[1, 2, 3, 4, 5]
left 1 0
[1, 2, 3, 4, 5]
left 2 0
[2, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
如您所见,
get_index(2,'左')
get_index(2,'右')
不同,这表明
a.index(c)
=
运算符的左侧和右侧没有相同的值


回到您的代码:

a[a.index(b)], a[a.index(c)] = a[a.index(c)], a[a.index(b)]
首先,它从
=
操作符的右侧执行代码,因此您有(c,b),然后
a[a.index(b)]
将取值
c
,在这一步,当
a.index(c)时,您的列表中有2个
c
它将返回从左到右找到的第一个
c
,在最后一步中,您希望将值
b
设置为
c
在开始时的位置,但现在您有两个
c
,如果
c
b
您将以所需的输出结束,因为方法
list.index
将返回实际
c
的位置;如果
b
c,则
b
将发生在b开始的位置,这将导致列表
a


例如:

case b < c
a = [1, 2, 3, 4, 5] --> swap 2 with 5; b = 2, c = 5
a[a.index(b)], a[a.index(c)] =  5, 2
a[a.index(b)] = 5 --> a = [1, 5, 3, 4, 5]
      -->  a.index(5) --> --> ↑
      ↑
a[a.index(c)] = 2 --> a =  [1, 2, 3, 4, 5]


case b > c
a = [1, 2, 3, 4, 5] --> swap 2 with 5; b = 5, c = 2
a[a.index(b)], a[a.index(c)] =  2, 5
a[a.index(b)] = 2 --> a = [1, 2, 3, 4, 2]
      -->  a.index(2) --> --> ↑
      ↑
a[a.index(c)] = 5 --> a =  [1, 5, 3, 4, 2]
案例b用5交换2;b=2,c=5
a[a.指数(b)],a[a.指数(c)]=5,2
a[a.index(b)]=5-->a=[1,5,3,4,5]
-->a.索引(5)-->-->↑
↑
a[a.index(c)]=2-->a=[1,2,3,4,5]
案例b>c
a=[1,2,3,4,5]-->用5交换2;b=5,c=2
a[a.指数(b)],a[a.指数(c)]=2,5
a[a.index(b)]=2-->a=[1,2,3,4,2]
-->a.索引(2)-->-->↑
↑
a[a.index(c)]=5-->a=[1,5,3,4,2]

您可以不使用
input()
,而是硬编码一个失败的已知输入吗?对不起,我刚刚编辑了它!请给我们一个答案;不要期望我们每个人都为你输入。这个程序应该做什么?你为什么期望其他产出?很明显,它是按照你编程的方式工作的——计算机在这方面相当烦人。@harveychoi这实际上是一个有趣的问题,但你让它很难理解。您只需显示一个简单的示例:
a[a.index(1)],a[a.index(2)]=a[a.index(2)],a[a.index(1)]
-您不需要所有的
input()
业务-然后简单地询问为什么它没有像您所期望的那样交换元素。