2016-02-12 58 views
12

在我写的小脚本中,.append()函数将输入的项目添加到列表的开头,而不是列表的末尾。 (您可以清楚地理解,很新的Python的,这样下去容易对我)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

+2

FWIW,使用Python中的递归是很少,除非你正在处理递归数据结构是个好主意(例如树),因为Python限制了递归调用的深度,并且它不能执行[tail call](https://en.wikipedia.org/wiki/Tail_call)消除。 –

+5

如果您是python的新手...您为什么使用python2.7'5年以上的版本?现在只需要学习python3,并且最终如果oyu需要处理遗留系统,您将学到与python2的区别。 – Bakuriu

+0

最好的在线工具(在询问一些朋友之后决定)是Codecademy,它使用了2.7。另外,我被告知没有太多差异,我可以轻松切换到3.x。我还参加了一些3.x课程,如Udemy,但尚未开始。当我感觉舒服时,我可能会切换到3.x) – firko

回答

28

好了(我进了输入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'] 
+0

确实很好解释。谢谢。! –

4

你的递归函数添加entered_text到列表之前getting_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内容会以相反的顺序。

5

您正在脚本中进行递归。附加到列表之前,脚本进入getting_text。因此,递归函数最终返回时会执行附加操作。通过这种方式,您可以在执行append()调用的返回路径上向下走栈,并以相反的顺序执行。

也许更容易unterstand这样的:

getting_text() 
    getting_text() 
     getting_text() 
     append() 
    append() 
append() 

如果你想有结果的“正确”的顺序前进排队append,在getting_text()调用之前。

3

顺序向后由于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 
+0

那么,通过在递归调用之前进行追加(如其他一些答案所示)来获得所需的顺序是可能的。但我当然同意,最好在这里使用一个简单的'while'循环而不是递归。 –

+0

这也是正确的,感谢您的帮助 – firko

3

你正在做一些讨厌的递归这里的东西:你打电话的功能:

getting_text(entered_text) 

从它内部自我。我不是证明这是你想要的。

我已经创造了一些东西,是丑陋的太多,但你想要做什么 - 我想..

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: "))  
+1

在函数内调用'sys.exit()'有点激烈。为什么不输入正常文本时输入“True”,输入“完成”时输入False。顺便说一句,当你需要退出时,比'sys.exit()'更简单:你可以执行'exit()'。 –

+0

是的,它正是我想要的 – firko

+0

下午2环:你是对的... –