将列表转换为链接列表的不同方法Python 3

时间:2017-08-03 18:33:52

标签: python list linked-list

我想知道

之间有什么区别
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而不是仅覆盖数据。

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

2 个答案:

答案 0 :(得分:1)

看一下第一个例子,考虑一下发生了什么。您有一个分配给lst的字典。 lst所指的内容永远不会改变 - 它总是同一个dict实例。

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

当循环完成时,head is lst - 也就是说,它们引用同一个对象 - 因此,head['next'] is head - 它指向自己!无论您的计算机有多快或屏幕有多大,打印出这种递归结构都会让人不知所措。 :-) Python使用...表示它已循环回已打印的内容。

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

答案 1 :(得分:1)

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

你得到d = {'data': 3, 'next': {...}}。省略号(...通常表示递归引用。

您可以打印id输出

来确认
In [1171]: id(d)
Out[1171]: 4456623368

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

在第二种情况下,您在每次迭代时重新声明 lst,这样您就可以安全了。