Список списка Python
В маленьком script, который я написал, функция .append() добавляет введенный элемент в начало списка, а не конец этого списка. (Как вы можете ясно понять, я совершенно новичок в Python, так что легко на меня)
list.append(x)
Добавить элемент в конец списка; эквивалентно a[len(a):] = [x]
.
Что говорится в https://docs.python.org/2/tutorial/datastructures.html.
Вы можете увидеть мой код ниже:
user_input = []
def getting_text(entered_text):
if entered_text == "done":
print "entering the texts are done!"
else:
getting_text(raw_input("Enter the text or write done to finish entering "))
user_input.append(entered_text)
getting_text(raw_input("Enter the first text "))
print user_input
Я что-то не понимаю, потому что функция печати печатает c,b,a
вместо a,b,c
(порядок ввода ввода a,b,c
)
Ответы
Ответ 1
Хорошо, это то, что происходит.
Если ваш текст не соответствует "done"
, вы запрограммировали его так, чтобы немедленно снова вызывал функцию (т.е. рекурсивно вызывал ее). Обратите внимание, как вы на самом деле установили его для добавления элемента в список ПОСЛЕ того, как вы делаете строку getting_text(raw_input("Enter the text or write done to finish entering "))
.
Итак, когда вы добавляете свои переменные, он будет добавлять все переменные ПОСЛЕ того, как это делается с рекурсивной функцией.
Следовательно, когда вы набираете a
, он снова вызывает эту функцию (пока ничего не внесен в список). Затем введите b
, затем c
. Когда вы вводите done
, рекурсивный бит завершается. ТЕПЕРЬ, он делает user_input.append(...
. ОДНАКО, порядок отменен, потому что он имеет дело с c
первым, поскольку это было последним.
Это может быть показано при печати списка внутри функции:
>>> def getting_text(entered_text):
... print user_input
... if entered_text == "done":
... print "entering the texts are done!"
... else:
... getting_text(raw_input("Enter the text or write done to finish entering "))
... user_input.append(entered_text)
...
>>>
>>> getting_text(raw_input("Enter the first text "))
Enter the first text a
[]
Enter the text or write done to finish entering b
[]
Enter the text or write done to finish entering c
[]
Enter the text or write done to finish entering done
[]
entering the texts are done!
>>> user_input
['c', 'b', 'a']
Обратите внимание на строку отчета печати 2.
Итак, как вы это исправите? Просто: добавьте в список, прежде чем вы будете рекурсивно звонить.
>>> user_input = []
>>> def getting_text(entered_text):
... if entered_text == "done":
... print "entering the texts are done!"
... else:
... user_input.append(entered_text)
... getting_text(raw_input("Enter the text or write done to finish entering "))
...
>>> user_input = []
>>> getting_text(raw_input("Enter the first text "))
Enter the first text a
Enter the text or write done to finish entering b
Enter the text or write done to finish entering c
Enter the text or write done to finish entering done
entering the texts are done!
>>> user_input
['a', 'b', 'c']
Ответ 2
У вас есть рекурсия в script. script переходит в getting_text
перед добавлением в список. Таким образом, добавление выполняется, когда функция рекурсии возвращается окончательно. Таким образом, вы идете по стеку вниз по обратному пути, выполняя вызов append()
, ожидающий выполнения в обратном порядке.
Может быть, легче убрать это:
getting_text()
getting_text()
getting_text()
append()
append()
append()
Если вы хотите, чтобы результат в "правильном" порядке переместил append
в строке вверх, перед вызовом getting_text()
.
Ответ 3
Рекурсивная функция getting_text
вызывает себя перед добавлением entered_text
в список. Таким образом, эффект внутренних вызовов предшествует эффекту внешних вызовов.
Если вы обмениваетесь
getting_text(raw_input("Enter the text or write done to finish entering "))
user_input.append(entered_text)
к
user_input.append(entered_text)
getting_text(raw_input("Enter the text or write done to finish entering "))
то содержимое user_input
будет в обратном порядке.
Ответ 4
Порядок обратный из-за рекурсивности getting_text
, он должен работать как ожидалось, если вы добавите entered_text
до рекурсивного вызова или используйте итеративную функцию, подобную этой
user_input = []
def getting_text(entered_text):
while (entered_text != 'done'):
user_input.append(entered_text)
entered_text = raw_input("Enter the text or write done to finish entering ")
print "entering the texts are done!"
getting_text(raw_input("Enter the first text "))
print user_input
Ответ 5
вы делаете некоторые неприятные рекурсивные вещи здесь: вы вызываете функцию:
getting_text(entered_text)
изнутри себя. Я не certan, это то, что вы хотите.
Я создал кое-что, что тоже уродливо, но делает то, что вы хотите - я думаю..
import sys
user_input = []
def getting_text(entered_text):
if entered_text == "done":
print user_input
sys.exit(0)
else:
user_input.append(entered_text)
while(1):
getting_text(raw_input("Enter the text or write done to finish entering: "))