好了(我进了输入a,b,c
的顺序),这发生了什么事情。
当您的文字是不是"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']
注意print语句线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']
FWIW,使用Python中的递归是很少,除非你正在处理递归数据结构是个好主意(例如树),因为Python限制了递归调用的深度,并且它不能执行[tail call](https://en.wikipedia.org/wiki/Tail_call)消除。 –
如果您是python的新手...您为什么使用python2.7'5年以上的版本?现在只需要学习python3,并且最终如果oyu需要处理遗留系统,您将学到与python2的区别。 – Bakuriu
最好的在线工具(在询问一些朋友之后决定)是Codecademy,它使用了2.7。另外,我被告知没有太多差异,我可以轻松切换到3.x。我还参加了一些3.x课程,如Udemy,但尚未开始。当我感觉舒服时,我可能会切换到3.x) – firko