简体   繁体   English

python`list`和`for`返回不同的结果

[英]python `list` and `for` return different results

Why do list and for report different result if I use them on the values generated by my function? 为什么listfor报告不同的结果,如果我用他们对我的函数生成的值?

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]))
>>> 

Your objects are modified as you iterate; 您的对象在迭代时会被修改; you are printing intermediate results when using for , final results when printing the list. 当使用for ,您正在打印中间结果,在打印列表时,您将打印最终结果。

If you append the results to a list first, you get the same results as your list() output again: 如果首先将结果附加到列表,则再次获得与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]))]

Each element in res is a tuple with the same two deque objects : 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

You could yield list() copies of each deque instead, and thus create new objects: 您可以改为生成每个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])]

The reason for the problem has been well explained by Javier . 哈维尔(Javier)很好地解释了问题的原因。 Now if you want same results using iteration you can use: 现在,如果您希望使用迭代获得相同的结果,则可以使用:

>>> [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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM