2017-08-03 86 views
-1

我想知道是什么不同的方式把一个列表到链接列表的Python 3

def makeList(myList): 
    head=None 
    lst={} 
    for value in myList: 
     lst['data']=value 
     lst['next']=head 
     head=lst 
    return head 

def makeList(myList): 
    head=None 
    for value in myList: 
     lst={} 
     lst['data']=value 
     lst['next']=head 
     head=lst 
    return head 

鉴于myList=[1,2,3,4,5,6,7]之间的区别,第一个返回{'data':7,'next':(...)},第二个实际上返回一个链表。这让我感到困惑,因为我不明白为什么我需要重新定义lst而不是仅仅覆盖数据。

另外,(...)是什么意思?

+0

同时运行并查看结果。他们是不同的。 –

+0

第一个你创建一个'dict'并不断改变它的内容。 – khelwood

+0

@尤金Sh。正如你可以在底部看到的,我确实运行了它们。我要求解释他们为什么不同。 – DrJessop

回答

1

看第一个例子,考虑发生了什么。你有一个字典分配到lst。什么lst是指永远不会改变 - 这是总是即同一个字典的实例。

每次运行循环时,都会更改单个字典,覆盖以前的值。

当循环完成时,head is lst - 也就是说,它们指向同一个对象 - 因此指向它本身!head['next'] is head - 它指向自己!无论你的电脑速度有多快,或者你的屏幕有多大,打印出这个递归结构都会让它不堪重负。 :-) Python使用...来表明它正在循环回已经打印出来的东西。

第二个例子没有这个问题。每次通过循环时,您都会创建一个字典的新实例并将其分配给lst;因此,lst的每个实例现在都是一个新对象,并且head只会指向最后创建的实例lst

+0

谢谢,@A。 Grebenisan,编辑建议! (因为错过了一个明显的错字,我感到羞耻!) –

1

在第一种情况下,您在循环外声明lst = {}一次,因此lst会在迭代之间重复使用。

你得到d = {'data': 3, 'next': {...}}。椭圆(...通常是指示递归引用。

您可以通过打印出id证实了这一点:

In [1171]: id(d) 
Out[1171]: 4456623368 

In [1172]: id(d['next']) 
Out[1172]: 4456623368 

在第二种情况下,你重新声明lst在每次迭代,所以你是安全的。

相关问题