2016-05-03 4 views
1

Вот моя функция от Python:Почему результаты печати отличаются от функции

def Ggen(word): 
    result = [] 
    while(len(word)!=1): 
     a = word.pop() 
     b = word 
     temp = (a,b) 
     print temp 
     result.append(temp) 
    return result 

Предположим, у меня есть данные называют test = ['f','c','a','m','p'].

Мой результат генерируется из print в функции:

('p', ['f', 'c', 'a', 'm']) 
('m', ['f', 'c', 'a']) 
('a', ['f', 'c']) 
('c', ['f']) 

Но если я бегу Ggen(test) я вместо этого:

[('p', ['f']), ('m', ['f']), ('a', ['f']), ('c', ['f'])] 

Что случилось с моим кодом. Кто-нибудь, как получить аналогичный результат сверху?

+1

'b = word' ... Просто подумайте об этом. Что такое слово? –

+1

Списки являются изменяемыми. Вы перебираете список в цикле. Вы печатаете их, прежде чем мутировать их, но возвращаете окончательное значение, которое было полностью мутировано. Почему бы не сделать копии списка на разных этапах, если вы хотите сохранить unmutated версии из ранее в цикле? Как бы то ни было, вы просто создаете целую кучу псевдонимов для одного и того же списка. –

+0

Слово - это всего лишь список элементов. Мой алгоритм каждый раз всплывал список и создавал (ключ, значение), где key - данные pop(), а значение - остальные данные в списке. Я продолжаю повторять до тех пор, пока результат не будет таким, как печать должна быть – someone

ответ

4

Каждый раз, когда вы word.pop(), вы меняете ссылку из списка, содержащегося в пределах result. Итак, вы печатаете промежуточные значения, но то, что вы в конце концов вернете, будет списком word, который вышел из цикла while.

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

def Ggen(word): 
    result = [] 
    while(len(word)!=1): 
     result.append((word.pop(),word[:])) 
    return result 
+0

Это одна работа, и спасибо за объяснение ^^ – someone

+0

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

Смежные вопросы