在我的代码中,我尝试获取列表中元素的所有组合(我不想使用itertools)。我通过用True
和False
对二进制进行计数,然后将其应用于原始列表以获取所有组合(如果为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,], ...]
。我可以打印x
或test
,它将打印相同的结果,但是我没有更改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]
它工作正常。
答案 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()