【问题标题】:python `list` and `for` return different resultspython `list` 和 `for` 返回不同的结果
【发布时间】:2014-11-07 16:43:02
【问题描述】:

如果我在函数生成的值上使用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]))
>>> 

【问题讨论】:

  • 您返回稍后修改的对象。不同之处不在于迭代方法,而在于您在生成值时或在全部生成值之后打印。

标签: python list generator


【解决方案1】:

您的对象在您迭代时被修改;使用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

您可以生成每个dequelist() 副本,从而创建 对象:

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

【讨论】:

  • 比我想发帖快大约 5 秒,超级快!
【解决方案2】:

Javier 已经很好地解释了问题的原因。现在,如果您想要使用迭代获得相同的结果,您可以使用:

>>> [i for i in n]
[(deque([2]), deque([1, 4, 5])), (deque([2]), deque([1, 4, 5])), (deque([2]), deque([1, 4, 5]))]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 2021-07-22
    • 2011-04-23
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    相关资源
    最近更新 更多