2014-09-14 2 views
3

Это работает так, как я хочупитон индекс списка математике переменная

a = [1,8,10] 
b = list([a]) 

a = [0,8,10] 

b.append(a) 

a = [0,0,10] 
b.append(a) 

print(b) 

давая мне список, что я хочу:

[[1, 8, 10], [0 , 8, 10], [0, 0, 10]]

мне нужно изменить значения с помощью переменных на основе индекса списка, как этот

a = [1,8,10] 
b = list([a]) 

a[0] = a[0] - 1 

b.append(a) 

print(b) 

и я получаю этот результат:

[[0, 8, 10], [0, 8, 10]] 

Моя вся суть заключается в следить за своими движениями для создания игра nim. Я думаю, что я вижу, как установка [0] = a [0] - 1 изменяет значение в обоих местах, даже когда я пытался использовать глубокую копию, но я в тупике о том, как еще получить ответ. Я уверен, что это очевидно, но я не знаю, какие ключевые слова использовать для поиска решения, поэтому, пожалуйста, помогите мне.

ответ

3

Использование deepcopy должно работать - я подозреваю, что вы использовали его не в том месте.

Опасность использования единого списка в качестве шаблона, как вы делали с a, заключается в том, что если вы его мутируете, вы можете в конечном итоге изменить список, который вы уже добавили в b. Один из способов обойти эту проблему - всегда создавать новую копию a всякий раз, когда вы хотите ее изменить.

import copy 

b = [] 

a = [1,8,10] 
b.append(a) 

a2 = copy.deepcopy(a) 
a2[0] = a2[0] - 1 
b.append(a2) 

print(b) 

Другой способ может быть, чтобы сделать копию a всякий раз, когда вы добавляете его в b, так что вы не должны продолжать создавать новые переменные:

import copy 

b = [] 

a = [1,8,10] 
b.append(copy.deepcopy(a)) 

a[0] = a[0] - 1 
b.append(copy.deepcopy(a)) 

print(b) 

общую точку между этими двумя разные подходы заключаются в том, что мы всегда добавляем данный список точно один раз. В вашем коде вы добавляете один и тот же список несколько раз до b. Это означает, что всякий раз, когда вы меняете a, кажется, что вы изменили все в b.

В двух приведенных мною примерах я добавляю список только один раз, и скопируйте его, если мне нужно внести изменения. Поступая таким образом, я гарантирую, что каждый список внутри b является уникальным и позволяет избежать проблем, с которыми вы столкнулись.

В качестве дополнительной заметки другой способ создания копии списка состоит в том, чтобы сделать a2 = a[:]. a[:] сообщает Python, чтобы получить список из a, начиная с начала списка до конца, по существу копируя его. Обратите внимание, что это мелкая копия, а не глубокая копия. Однако, поскольку ваши списки содержат только цифры, мелкая копия должна работать нормально.

+0

Спасибо! Добавление одного и того же списка несколько раз имеет смысл, и теперь, когда я знаю, как правильно добавить новый список, вы правы, так же работает. b = [] a = [1,8,10] b.добавление (а [:]) а [0] = а [0] - 1 b.append (а [:]) а [1] = а [1] - 8 b.append (а [ :]) печать (b) – JMJ