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

挑战:从包含 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)

出于调试目的,这里引入了很少的打印语句。从代码中可以看出,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

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


眼眸繁星
浏览 265回答 2
2回答

慕斯709654

当您正在执行asc = arr并且des = arr未创建新列表时。asc,des并且arr链接到一个列表对象,所以当你改变它们中的任何一个时,所有变量都将被更改,因为它是单个对象。In [1]: a = [1, 2]In [2]: b = aIn [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[:]

ITMISS

你需要做:asc = arr.copy()# or asc = arr[:]否则,当arr反向排序时,asc也会发生变化。asc是一个指向数组的指针,当arr改变时,asc改变。更好的是,您创建 的副本arr,因此更改不会反映回来。您编写的整个代码可以浓缩为这两行:arr = [2,1,3,4,5]print(sum(sorted(arr)[:4]))  # 10print(sum(sorted(arr, reverse=True)[:4]))  # 14# Or print(sum(sorted(arr)[-4:])) instead of the last print.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python