python3:当进入for循环时,列表的值会改变

2024-09-29 01:30:17 发布

您现在位置:Python中文网/ 问答频道 /正文

挑战:从包含5个元素的列表中找出4个元素中可以得到的最小和最大的和。你知道吗

方法如下:按降序和升序对列表排序,并将它们存储到两个不同的变量中。求两个列表中前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)

这里介绍的print语句很少用于调试。在代码中可以看到,排序的版本在进入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

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


Tags: in元素列表for排序printarrmini
2条回答

在执行asc = arrdes = arr时,不会创建新列表。ascdesarr链接到一个列表对象,因此您更改其中任何一个时,所有变量都将更改为单个对象。你知道吗

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)

如果你想要一份清单的话

asc = arr[:]
des = arr[:]

你需要做:

asc = arr.copy()
# or asc = arr[:]

或者,当arr被反向排序时,asc也会发生变化。asc是指向数组的指针,当arr更改时,asc更改。更好的方法是,创建一个arr的副本,这样更改就不会反射回来。


您编写的整个代码可以浓缩为以下两行:
arr = [2,1,3,4,5]

print(sum(sorted(arr)[:4]))  # 10
print(sum(sorted(arr, reverse=True)[:4]))  # 14

# Or print(sum(sorted(arr)[-4:])) instead of the last print.

相关问题 更多 >