在实例化列表的变量中使用时,主列表值会更改

时间:2018-11-03 17:26:30

标签: java python arrays arraylist

如何创建一个不能更改其值的列表,例如,我在Java中使用了for循环:

for (int i = 0; i < 5; i++) {
    for (int j = 0; j < 5; j++) {
                if (i != j) {
                    List<Integer> vizinhoAplicacao = new ArrayList<>(ordemAcoes); //HERE
                    vizinhoAplicacao.set(i, vizinhoAplicacao.get(i) + 5);
                    vizinhoAplicacao.set(j, vizinhoAplicacao.get(j) - 5);
                    calcularRetornoAnual(vizinhoAplicacao, contatorVizinho, numeroSimulacao);
                    contatorVizinho++;
                }
            }
        }

ordemAcoes的值始终与进入循环的值相同, 但是,当我使用python进行相同的场景绘制时,ordemAcoes会发生变化,就像我对使用它声明的对象进行更改时一样,我要做的是不更改ordemAcoes的值,因此每次进入循环时,与以前相同的值。

    for i in range(0, 5):
        for j in range(0, 5):
            if (i != j):
                neighborAplication = actionOrder #HERE is the list
                neighborAplication[i] = neighborAplication[i] + 5
                neighborAplication[j] = neighborAplication[j] - 5
                returnCalculateY(neighborAplication, countNeighbor, simulationNumber)
                countNeighbor += 1

Java结果:

[35, 20, 20, 15, 10]
[35, 25, 15, 15, 10]
[35, 25, 20, 10, 10]
[35, 25, 20, 15, 5]

Python的结果:

[35, 20, 20, 15, 10]
[40, 20, 15, 15, 10]
[45, 20, 15, 10, 10]
[50, 20, 15, 10, 5]

我希望在python中也有相同的结果,但是当我使用neighborAplication时,列表actionOrder值会更改。

1 个答案:

答案 0 :(得分:1)

问题在于

neighborAplication = actionOrder

您正在创建另一个名为neighborAplication的引用,并且
 assignment never copies data。当您对neighborAplicationactionOrder进行突变时,将在两个名称上看到更改,因为在内存中仅存在一个列表。

使用

neighborAplication = actionOrder[:]

为了创建列表的(浅)副本。

有关其他详细信息,请参见How to clone or copy a list?