将列表转换为链表的不同方法 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而不仅仅是覆盖数据。

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

查看第一个示例,考虑正在发生的事情。您有一个分配给lst的字典。lst所指的永远不会改变——它总是同一个词典实例。

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

当循环完成时,head is lst- 也就是说,它们引用同一个对象 - 因此,head['next'] is head- 它指向自身!无论您的计算机有多快或屏幕有多大,打印出这种递归结构都会压倒它。:-)Python使用...来表示它正在循环回已经打印出来的东西。

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

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

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

您可以通过打印id来确认这一点:

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

在第二种情况下,您在每次迭代时重新声明lst,因此您是安全的。

相关内容

  • 没有找到相关文章

最新更新