我想知道两者之间有什么区别
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
,因此您是安全的。