Python 为什么其他列表也会改变?
我已经解决了ProjectEuler的问题5(什么是最小的正数,它可以被1到20的所有数字整除(没有余数)?,但是我想找到一个更快的方法(目前是0.000109195709229秒) 我尝试了一种动态方法,但当我运行下面的代码(这只是第一部分)时,我不明白如果我显式地编写d[I][counter]+=1,为什么d[var][counter]会得到+1Python 为什么其他列表也会改变?,python,python-2.7,dictionary,Python,Python 2.7,Dictionary,我已经解决了ProjectEuler的问题5(什么是最小的正数,它可以被1到20的所有数字整除(没有余数)?,但是我想找到一个更快的方法(目前是0.000109195709229秒) 我尝试了一种动态方法,但当我运行下面的代码(这只是第一部分)时,我不明白如果我显式地编写d[I][counter]+=1,为什么d[var][counter]会得到+1 n = 20 d = {1:[0,1] + [0]*19} #a dictionary that assigns to each number
n = 20
d = {1:[0,1] + [0]*19} #a dictionary that assigns to each number a list of its prime factorization
for i in xrange(2,3): #I changed n+1 with 3 for simplicity
var = i
counter = 2
notDone = True
while notDone:
if var % counter == 0:
var /= counter
print var, d[var]
d[i] = d[var] #i has the same prime factorization of var ...
print var, d[var]
d[i][counter] += 1 #... except for 1 number (counter)
print var, d[var] #wtf?
notDone = False
else:
counter += 2 if counter != 2 else 1
这就是结果:
1 [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
1 [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
1 [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
为什么会发生这种情况?在生产线上
d[i] = d[var]
变量d[i]
将保存与d[var]
相同的列表对象,因为列表是可变的
相反,您需要一份d[var]
,您可以通过
d[i] = d[var][:]