2013-06-01 3 views
0

Я заметил что-то очень странное. Я попытался посмотреть, где это происходит, и понял, что по какой-то причине список nest[0] продолжает меняться в середине цикла.Для цикла через вложенный список

>>> nest = [['prefix'],['line 1'],['line 2']] 
>>> for part in nest[1:]: 
...  list = nest[0] 
...  list += part 
...  print list 

Вывод, который я получаю:

['prefix', 'line 1'] 
['prefix', 'line 1', 'line 2'] 

Принимая во внимание, что мне нужно:

['prefix', 'line 1'] 
['prefix', 'line 2'] 

Может кто-нибудь объяснить, почему это происходит? Я мог бы делать что-то очень глупое.

ответ

2

EDIT: с объяснением указателей, как запрошенной

Ваша проблема заключается в том, что когда вы задаете список к гнезду [0], вы не создаете новый список, ваш просто назначая указатель. Ваш указатель направлен в список, содержащий [ «префикс»]

На вашей первой итерации, вы что-то добавить к этому списку

На вашей второй итерации вы не сделаете новый список, вы просто переточки в Старый.

Затем, когда вы снова добавляете, вы добавляете в старый список!

Что вы имеете в виду:

nest = [['prefix'],['line 1'],['line 2']] 
for part in nest[1:]: 
    list = [] + nest[0] 
    list += part 
    print list 

Там в несколько способов, чтобы думать об этом. Вот он. Допустим, у вас есть колода карт объекта:

myobj = Deck(). 

Если бы я тогда сказать,

myobj2 = myobj, 

Я не создал новую колоду карт, было бы, как кто-то смотрит на палубе I уже есть. Мы должны иметь возможность сделать это, чтобы сделать много программирования (это основы объектно-ориентированного дизайна)! Мне нужно было бы сказать

myobj3 = Deck() 

для создания новой колоды карт.

Рассмотрим:

myobj.shuffle #we're shuffling one deck, that two people are looking at 

Оба myobj и myobj2 изменится. Вызов myobj3.shuffle оставляет два других нетронутых. То, что вы сделали, заставило кого-то снова взглянуть на ту же колоду, где вы хотели сделать новую!

+0

спасибо. Код работал. Я не понимаю, почему мой не работает. Поэтому, когда я пытаюсь 'list = ['prefix']', я вижу, что он делает то, что я хочу. Почему указание на тот же объект меняет его? – Rohit

+0

Post-EDIT: Спасибо за объяснение. Я все еще пытаюсь склонить голову, как это относится к моей проблеме. Вы говорите, что 'nest [0]' является объектом 'Deck()' в вашем примере? – Rohit

+0

Ваше «гнездо [0]» - это колода карт. Calling list = nest [0] просто говорит нам посмотреть на колоду (в которой есть слово «префикс»), а затем сохранить этот поиск в месте, помеченном «list». Здесь мы никогда не создаем новую колоду карт или новый список. Поэтому, когда вы добавляете часть в список, вы добавляете новую карту в колоду. На следующей итерации вы снова вызываете list = nest [0], но это просто говорит вам оглянуться на колоду, в которой теперь есть дополнительная карта. Когда мы добавляем еще одну карту, у нас теперь есть две дополнительные услуги. Это помогает? –

0

list = nest[0] значит присвоить указатель на гнездо [0] для имени переменной list

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

nest = [['prefix'],['line 1'],['line 2']] 
for part in nest[1:]: 
    list = nest[0] + part 
    print list 

nest[0] + part создаст новое значение и присвоить list

0

это просто уточнение в простых словах:

неправильно

'list += part' 

в

' for part in nest[1:]: 
list = nest[0] 
list += part 
print list' 

список переменных изменит свое значение в каждой итерации .. я имею в виду varible список будет присвоены следующие значения:

список = [ «префикс»] затем после первой итерации он будет переназначен быть:

список = [ «префикс», «строка 1»] ## обратите внимание на список цикл преобразования приложений + = часть, если вы по-прежнему будет получать все члены [гнезда]

поэтому фокус на решение gitting отдельной переменной которые сохраняют постоянное значение на каждой итерации

'list = [] + nest[0]' 
Смежные вопросы