列表被突变,但我没有直接对其进行突变

时间:2020-08-05 23:20:52

标签: python-3.x list variables mutate

在我的代码中,我尝试获取列表中元素的所有组合(我不想使用itertools)。我通过用TrueFalse对二进制进行计数,然后将其应用于原始列表以获取所有组合(如果为True,则该数字将保留在列表中,否则将被删除) 。现在,我为x分配了0,所以[False, False, ...]并在循环中添加了二进制数。现在的问题是,如果我想将列表重置为0,它将不会更改,而只是继续使用以前的列表。例如,在第一个代码print(x)中打印:[False,False,False,False,False,False,False,False,],[True,False,False,False,False,False,False,False,],[True,True,False,False,False,False,False,False,], ...]。我可以打印xtest,它将打印相同的结果,但是我没有更改x。有什么想法吗?

def get_combinations(arr):
    true = []
    x = []

    for thing in range(0,len(arr)):
        true.append(thing)
        x.append(False)

    true.sort(reverse=True)
    test = []
    final = []
    länge = 2**len(arr)
    for number in range(länge):

        test = x   <------------------------------- here
        #print(x) or print(test)
        for thing in true:

            if number / (2**thing) >= 1:
                test[thing] = True
                number -= 2**thing  
  
        final.append(test)

    return final


test = [1,2,4,5,3,1,5,13]
get_combinations(test)

如果我将行更改为:

test = [False,False,False,False,False,False,False,False]

它工作正常。

1 个答案:

答案 0 :(得分:0)

查找“ Python中的深层复制与浅层复制”

简而言之:

x= [1,2,3] 

如果:

y = x       # x: [1,2,3]  , y: [1,2,3]
y[0] = 4    # x: [4,2,3]  , y: [4,2,3]

-请注意,通过y = x,“ y”和“ x”被设置为相等,但更重要的是,“ x”和“ y”是相同的对象……任何一个改变都会改变另一个。 因此y[0] = 4也影响x。即x[0] is also now 4

另一方面:

y = x.copy()  # x: [1,2,3]  , y: [1,2,3]
y[0] = 4      # x: [1,2,3]  , y: [4,2,3]

-这里的“ y”与“ x”具有相同的值,但是它们是不同的对象。 通过y[0] = 4更改y不会影响'x'。

在您的代码中:

test =x

和后来的'test'元素被修改,改变'x', 然后在for loop的下一次迭代中,“ x”不再为[False,False ...]

将该行替换为:

test =x.copy()