2017-08-03 61 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在每次迭代,所以你是安全的。