2015-11-01 2 views
1

Я уже решил проблему 5 Project Euler (Какое наименьшее положительное число равномерно делится (без остатка) на все числа от 1 до 20?), Но я хочу найти более быстрый способ (в настоящее время 0.000109195709229 секунд).Почему изменился и другой список?

Я попробовал динамический подход, но когда я запускаю этот код (это только первая часть) Я не понимаю, почему д [VAR] [счетчик] получает +1, если я явно писал D [ i] [counter] + = 1.

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] 

почему это происходит?

ответ

1

На линии

d[i] = d[var] 

переменная d[i] будет держать один и тот же объект списка, как d[var], так как списки изменяемый.

Вместо этого вам нужна копия из d[var], которую вы можете получить, например. на

d[i] = d[var][:] 
Смежные вопросы