列表重新分配彼此,而不指定更改它们

时间:2017-11-06 10:05:20

标签: python python-3.x

我一直在努力创建一个程序,可以获得比萨的多个分数。然后,我需要删除列表中的最高和最低值以删除异常值。但是,当我尝试删除最高和最低分时,它会删除oldScores列表中的最高和最低分数

pizzaScores = [[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]]
oldPizzaScores = pizzaScores
for i in range(len(pizzaScores)):
    pizzaScores[i].remove(max(pizzaScores[i]))
    pizzaScores[i].remove(min(pizzaScores[i]))
print(oldPizzaScores)
print(pizzaScores)

4 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为您只是分配了对象oldPizzaScores = pizzaScores,并且未在此处复制值。您可以使用深度复制来复制oldPizzaScores = deepcopy(pizzaScores)

等值

使用深层复制。

from copy import deepcopy
pizzaScores = [[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]]
oldPizzaScores = deepcopy(pizzaScores)
for i in range(len(pizzaScores)):
    pizzaScores[i].remove(max(pizzaScores[i]))
    pizzaScores[i].remove(min(pizzaScores[i]))
print(oldPizzaScores)
print(pizzaScores)

<强>输出:

[[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5] ],[1,2,3,4,5]]

[[2,3,4],[2,3,4],[2,3,4],[2,3,4],[2,3,4]]

答案 1 :(得分:0)

前段时间我经历了similar issue

oldPizzaScores = pizzaScores是真正的罪魁祸首。它将pizzaScores变量的引用分配给oldPizzaScores。 因此,您对pizzaScores所做的任何更改都将应用于另一个列表原始列表,您在该行中引用了该列表。

要避免此问题,您应该使用deepcopy

中的copy方法

将行oldPizzaScores = pizzaScores更改为oldPizzaScores = deepcopy(pizzaScores)

from copy import deepcopy
pizzaScores = [[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]]
oldPizzaScores = deepcopy(pizzaScores)
for i in range(len(pizzaScores)):
    pizzaScores[i].remove(max(pizzaScores[i]))
    pizzaScores[i].remove(min(pizzaScores[i]))
print(oldPizzaScores)
print(pizzaScores)

<强> P.S。

根据PEP8样式指南,如果您使用以_分隔的小写的变量名称

,那将会很棒

例如,oldPizzaScores应重命名为old_pizza_scores,依此类推!

答案 2 :(得分:0)

pizzaScores = [[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]]
oldPizzaScores = [[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]]
for i in range(len(pizzaScores)):
    pizzaScores[i].remove(max(pizzaScores[i]))
    pizzaScores[i].remove(min(pizzaScores[i]))
print(oldPizzaScores)
print(pizzaScores)

答案 3 :(得分:0)

在你的代码中, 第二行是错误的所在。

oldPizzaScores = pizzaScores

此行使新引用(oldPizzaScores)指向值(pizzaScores也指向该值)。这意味着 -

1. If you change oldPizzaScores then pizzaScores will also change accordingly. For eg,
    >>> oldPizzaScores.pop() // remove the last item
    >>> oldPizzaScores
    >>> pizzaScores   // same valua as above

2. Similar as point 1 with pizzaScores.

解决方案 -

Do a deep copy of pizzaScores such that the values are copied to oldPizzaScores, i.e.
    from copy import deepcopy
    oldPizzaScores = deepcopy(pizzaScores)

您也可以使用切片运算符代替deepcopy模块。做 -

    oldPizzaScores = pizzaScores[:]