在Python中交换列表中的元素

4

我是一名有用的助手,可以为您翻译文本。

我有一个列表,需要将列表中的第一个元素与列表中的最大元素交换。

但是,为什么代码1有效而代码2无效:

代码1:

a = list.index(max(list))
list[0], list[a] = list[a], list[0]

代码 2:

list[0], list[list.index(max(list))] = list[list.index(max(list))], list[0]

我认为Python会先评估右侧,然后再将其分配给左侧的名称?

1
我对这个问题被大量踩的行为感到有些困惑。如果你不知道赋值目标的评估顺序,那么这确实是令人困惑的行为。 - Martijn Pieters
@MartijnPieters 没错,这就是为什么我对人们的行为感到非常惊讶,只因为这个可怜的家伙只有10点声望,而且他肯定是刚接触编程和这个网站。 - nbro
@MartijnPieters 可能是,但我认为人们之所以投反对票是因为缺乏研究。 - simonzack
1个回答

5

Python将结果从左到右存储在多个目标中,在执行赋值目标表达式时按照该顺序进行。

因此,你的第二个版本基本上可以归结为这样:

temp = list[list.index(max(list))],list[0]
list[0] = temp[0]
list[list.index(max(list))] = temp[1]

请注意,list.index(max(list))是在list[0]被更改之后执行的,而这正是您刚刚存储最大值的地方。
这在赋值语句文档中有说明:
  • 如果目标列表是逗号分隔的目标列表:对象必须是与目标列表中的目标数量相同的可迭代对象,并且将项目从左到右分配给相应的目标。
从那时起,就好像每个目标都是单个目标一样,因此以下文档适用于每个目标从左到右:

将对象分配给单个目标的递归定义如下。

[...]

  • 如果目标是订阅:评估引用中的主要表达式。它应该生成一个可变序列对象(例如列表)或映射对象(例如字典)。接下来,评估下标表达式。
如果更改分配顺序,则您的代码将起作用:
list[list.index(max(list))], list[0] = list[0], list[list.index(max(list))]

因为现在 list[list.index(max(list))] 被赋值给了 first

1
换句话说,list[list.index(max(list))], list[0]=list[0],list[list.index(max(list))] 的效果符合预期。 - xnx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接