python 3 : values of a list change when it enters a for loop

标签 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)

这里为了调试目的引入了几个打印语句。从代码中可以看出,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 循环时会改变它们的顺序??

最佳答案

当您执行 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[:]

关于 python 3 : values of a list change when it enters a for loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53967567/

相关文章:

Ruby 按 boolean 值和数字排序

java - 数组列表排序

javascript - 使用查询或使用编程语言从 SQLite 中排序数据

python - 从 Python 中的分隔字符串创建双引号条目列表

Python TfidfVectorizer 抛出 : empty vocabulary; perhaps the documents only contain stop words"

javascript - 显示子节点 NodeList 的最简单方法? (初学者)

ios - 初学者 : Storing Array Data in iOS

python - 无法正确获取 valid_data.get() 值

python - 如果在 tensorflow 中满足条件,则将数字添加到张量等级 1 中的元素

c - 无维度的全局整数数组