我想知道
之间有什么区别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 :(得分: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
,这样您就可以安全了。