python 3:列表的值在进入for循环时发生变化

man*_*dka 2 python arrays sorting

挑战:找到可从包含5个元素的列表中的四个元素中获得的最小和最大总和.

接下来的方法:按降序和升序对列表进行排序,并将它们存储到两个不同的变量中.找到两个列表中前4个元素的总和.一个总和是最小的,第二个是最大的.

代码:

arr = [2,1,3,4,5]
arr.sort()
asc = arr
print(asc[0],asc[1],asc[2],asc[3])
arr.sort(reverse = True)
des = arr
print(des[0],des[1],des[2],des[3])
maxi = 0
mini = 0
for j in range(4) :
    mini = mini + asc[j]
    print(mini, asc[j])
    maxi = maxi + des[j]
    print(maxi,des[j])
print(mini, maxi)
Run Code Online (Sandbox Code Playgroud)

这里引入的打印语句很少用于调试目的.在代码中可见,bot在进入for循环之前和进入循环之后打印已排序的版本.如输出中所见,它清晰可见,应该按升序保持元素的列表具有降序的元素.

输出:

11 12 13 14 - list in the ascending order
15 14 13 12 - list in the descending order

15 15 - round 0
15 15

29 14 - round 1
29 14

42 13 - round 2
42 13

54 12 - round 3
54 12

54 54 - final output
Run Code Online (Sandbox Code Playgroud)

为什么一个特定列表中的元素在进入for循环时会改变它们的顺序?

Ser*_*ach 5

在您执行操作时asc = arr,des = arr未创建新列表.asc,des并且arr链接到一个列表对象,所以当你更改其中的任何一个时,所有变量都将被更改,因为它是单个对象.

In [1]: a = [1, 2]

In [2]: b = a

In [3]: id(a), id(b)
Out[3]: (140601802913048, 140601802913048)

In [4]: b = a[:]

In [5]: id(a), id(b)
Out[5]: (140601802913048, 140601819243872)
Run Code Online (Sandbox Code Playgroud)

如果你想拥有一份清单副本

asc = arr[:]
des = arr[:]
Run Code Online (Sandbox Code Playgroud)