为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

眼眸繁星 2021-09-28 16:15:55
挑战:从包含 5 个元素的列表中找到可以从四个元素中获得的最小和最大和。方法如下:按降序和升序对列表进行排序,并将它们存储到两个不同的变量中。查找两个列表中前 4 个元素的总和。一笔金额最少,第二笔金额最多。代码 :arr = [2,1,3,4,5]arr.sort()asc = arrprint(asc[0],asc[1],asc[2],asc[3])arr.sort(reverse = True)des = arrprint(des[0],des[1],des[2],des[3])maxi = 0mini = 0for 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 order15 14 13 12 - list in the descending order15 15 - round 015 1529 14 - round 129 1442 13 - round 242 1354 12 - round 354 1254 54 - final output为什么某个特定列表中的元素在进入 for 循环时会改变它们的顺序?
查看完整描述

2 回答

?
慕斯709654

TA贡献1840条经验 获得超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)

如果你想要一份清单的副本,做


asc = arr[:]

des = arr[:]


查看完整回答
反对 回复 2021-09-28
?
ITMISS

TA贡献1871条经验 获得超8个赞

你需要做:


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.


查看完整回答
反对 回复 2021-09-28
  • 2 回答
  • 0 关注
  • 260 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信