![](/img/trans.png)
[英]Python Scikit - LinearRegression and Ridge return different results
[英]python `list` and `for` return different results
為什么list
並for
報告不同的結果,如果我用他們對我的函數生成的值?
from collections import deque
def neighbours(comp0, cand0):
comp = deque([i for i in comp0])
cand = deque([i for i in cand0])
for i in range(len(cand)):
elem = cand.popleft()
comp.append(elem)
yield comp, cand
comp.pop()
cand.append(elem)
return
>>> n = neighbours([2], [1,4,5])
>>> list(n)
[(deque([2]), deque([1, 4, 5])), (deque([2]), deque([1, 4, 5])), (deque([2]), deque([1, 4, 5]))]
>>> n = neighbours([2], [1,4,5])
>>> for i in n:
... print(i)
...
(deque([2, 1]), deque([4, 5]))
(deque([2, 4]), deque([5, 1]))
(deque([2, 5]), deque([1, 4]))
>>>
您的對象在迭代時會被修改; 當使用for
,您正在打印中間結果,在打印列表時,您將打印最終結果。
如果首先將結果附加到列表,則再次獲得與list()
輸出相同的結果:
>>> n = neighbours([2], [1,4,5])
>>> res = []
>>> for i in n:
... print(i)
... res.append(i)
...
(deque([2, 1]), deque([4, 5]))
(deque([2, 4]), deque([5, 1]))
(deque([2, 5]), deque([1, 4]))
>>> res
[(deque([2]), deque([1, 4, 5])), (deque([2]), deque([1, 4, 5])), (deque([2]), deque([1, 4, 5]))]
res
中的每個元素都是具有相同兩個雙端隊列對象的元組:
>>> res[0][0] is res[1][0] is res[2][0]
True
>>> res[0][1] is res[1][1] is res[2][1]
True
您可以改為生成每個deque
list()
副本,從而創建新對象:
>>> def neighbours(comp0, cand0):
... comp = deque([i for i in comp0])
... cand = deque([i for i in cand0])
... for i in range(len(cand)):
... elem = cand.popleft()
... comp.append(elem)
... yield list(comp), list(cand)
... comp.pop()
... cand.append(elem)
...
>>> n = neighbours([2], [1,4,5])
>>> res = []
>>> for i in n:
... print(i)
... res.append(i)
...
([2, 1], [4, 5])
([2, 4], [5, 1])
([2, 5], [1, 4])
>>> res
[([2, 1], [4, 5]), ([2, 4], [5, 1]), ([2, 5], [1, 4])]
哈維爾(Javier)很好地解釋了問題的原因。 現在,如果您希望使用迭代獲得相同的結果,則可以使用:
>>> [i for i in n]
[(deque([2]), deque([1, 4, 5])), (deque([2]), deque([1, 4, 5])), (deque([2]), deque([1, 4, 5]))]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.