1 回答
TA贡献1810条经验 获得超5个赞
变量min1和不会更新,它们不是对列表的第一个和第二个元素的引用,它们是对发生赋值时min2索引 0 和 1 处的值的引用。你以后改变并不重要。list[0]list[1]
在Python中,列表索引和变量都只是对实际对象的引用。将 Python 对象想象成气球,变量和索引只是绑定到气球上的字符串的标签。您可以将多个标签附加到气球上,但如果您将标签移动到不同的气球上,则绑定到旧气球上的其他标签将不会跟随。
在这里,min1和min2被绑在气球上,气球上已经绑有0和索引标签。1后来,当您分配给 时list[i],您将特定的索引标签重新绑定到另一个气球,但min1和min2标签没有改变。
附带说明一下,这部分代码有一个相当明显的错误:
if list[0] < list[1]:
list[i] = list[1]
else:
list[i] = list[1]
两个分支都做完全相同的事情,分配list[1]给list[i].
否则,即使您希望在循环内更改 和 会更改 和 的值,您也会执行完全错误的分配,您正在更改列表中的另一个list[0]值list[1],即min1应该min2较小list[i]的值。
因此,对于i = 2,list[i]islist[2]和list[2] < list[0]is true (1 < 4),然后测试 if list[0] < list[1](也是 true,4 < 5),因此您可以list[i] = list[1]设置list[2] = 5,将设置保留list[0]为4,list[1]设置为5,并实际上丢弃1出现在的值list[2]前。
不要与list[0]or进行比较list[1],而是让循环更新min1and min2:
# min1 is always smaller than min2
min1, min2 = list[:2]
if min2 < min1:
min1, min2 = min2, min1
for i in range(1, length):
if list[i] < min1:
min1 = list[i]
elif list[i] < min2: # but equal to or greater than min1!
min2 = list[i]
我还确保min1 < min2在一开始,这使循环变得更加简单,因为如果list[i] < min1不成立,那么它可能会小于min2但您不需要min1第二次测试。
请注意,我们在这里将list[i]值分配给min1和min2,您希望用刚刚测试的值更新这两个变量list[i],前提是确实小于之前的值。
添加回答
举报