交换列表中两元素

想实现交换列表中两个元素的功能,代码如下:

lst = [1,2,3,4,5,6,7,8,9,10]

tmp = 8
tmp_index = lst.index(tmp)

方法一

lst[0], lst[tmp_index] = lst[tmp_index], lst[0]
print(lst) # [8,2,3,4,5,6,7,1,9,10]

方法二

lst[0], lst[lst.index(tmp)] = lst[lst.index(tmp)], lst[0]
print(lst) # [1,2,3,4,5,6,7,8,9,10]

问题是:为什么方法二无法交换列表中两个元素,而方法一可以,明明 tmp_index = lst.index(tmp)。

讨论数量: 2

这是因为在赋值时,右边的表达式先于左边的表达式进行计算,参考: docs.python.org/3/reference/expres....

因此,方法二就相当于 lst[0], lst[lst.index(tmp)] = 8, 1, 这就意味着列表第一个元素变为8,但此时在对左边第二个表达式进行求值时,index方法取的是列表中第一个8所在的位置,因此 lst.index(tmp) 此时为0,所以lst[0]=1,这就意味着列表第一个元素又变回了1。可以通过设置index的第二参数来验证:

lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
tmp=8
tmp_index = lst.index(tmp)

# method 2
lst[0], lst[lst.index(tmp)] = lst[lst.index(tmp)], lst[0]
print(lst) # The result is wrong: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

lst[0], lst[lst.index(tmp)] = 8, 1
print(lst) # The result is wrong: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
lst[0], lst[lst.index(tmp,1)] = 8, 1
print(lst) # The result is correct: [8, 2, 3, 4, 5, 6, 7, 1, 9, 10]

而第一种方法,因为明确了 tmp_index为7,所以lst[0], lst[tmp_index] = lst[tmp_index], lst[0]可以正常交换。

1年前 评论
Jason990420
tmp = 8
lst = [1,2,3,4,5,6,7,8,9,10]

# lst[0], lst[lst.index(tmp)] = lst[tmp_index], lst[0]
# lst[0], lst[lst.index(tmp)] = 8, 1

lst[0] = 8  # [8,2,3,4,5,6,7,8,9,10]

# lst[lst.index(tmp)] = 1
lst[0] = 1  # [1,2,3,4,5,6,7,8,9,10]

print(lst)  # [1,2,3,4,5,6,7,8,9,10]
1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!