为什么当我尝试分配给一个列表时每个列表值都会改变?

问题描述 投票:0回答:2

我正在尝试使用背包问题进行简单的爬坡。

我有一个调整函数,该函数旨在返回馈入其中的二进制值列表的稍微修改的值。然后,我将此新值与现有值进行比较,以了解更好的方法。

但是,我遇到了一个奇怪的问题,当我尝试将新解决方案分配为当前解决方案的调整副本时,将立即用调整后的值替换当前解决方案和新解决方案。循环中的每个列表都将替换为相同的值,我也不知道为什么。我已经尝试与其他列表具有相同效果的相同事物。为什么会这样?

编辑:从数组更改为列表

from random import randrange
import numpy as np

val = [8, 7, 6, 3, 3]
iteration = 0


def generateInitialState():
    array = []
    k=0
    while k != len(val):
        array.append(randrange(0,2))
        k+=1
    return array

CurrentSolution = generateInitialState()


def Quality(Solution):
    sum_items = 0
    newValue = np.multiply(val,Solution)
    for item in newValue:
        sum_items += item
    return sum_items

def Tweak(Solution):
    print(str(Solution) + ' : ' + str(Quality(Solution)))
    TempSolution = Solution
    if Solution[iteration] is 0:
        TempSolution[iteration] = 1
    else:
        TempSolution[iteration] = 0   
    print(str(TempSolution) + ' : ' + str(Quality(TempSolution)))
    return TempSolution 


while iteration < 5:
    iteration+=1
    NewSolution = Tweak(CurrentSolution)

    if Quality(NewSolution) > Quality(CurrentSolution):
        print('New good value detected'+ str(Quality(NewSolution)))
        CurrentSolution = NewSolution
    else:
        print('Best solution found')
        break
python
2个回答
0
投票

在Python中,变量始终是对对象的引用,而不是对象本身。对象是驻留在内存中的一条数据,或者至少可以这样想象。用Python术语来说是“变量绑定到对象”。

如果将一个变量分配给另一个变量,例如TempSolution = Solution,则将引用复制到同一对象(列表)。换句话说,这两个变量现在都已绑定到内存中的同一列表,并且通过一个变量或另一个变量来更改列表并不重要。

要复制对象本身,请查看Python的copy标准库(https://docs.python.org/3/library/copy.html)。它提供功能copydeepcopy。前者复制一个对象,但不复制内部的引用,而后者则递归地复制所有引用。

所以,我建议:

import copy

# ...

def Tweak(Solution):
    # ...
    TempSolution = copy.copy(Solution)

[恕我直言,与TempSolution = Solution[:]相对,这更清楚地表明您打算复制列表。


0
投票

TempSolution = Solution[:]这解决了问题!评论中有更多详细信息

© www.soinside.com 2019 - 2024. All rights reserved.