Python中的模糊迭代器行为

Python中的模糊迭代器行为,python,Python,因此,我尝试使用somo Odoo代码Qweb模板,使其更加具体,我发现了这个函数 def foreach_iterator(base_ctx, enum, name): ctx = base_ctx.copy() if not enum: return if isinstance(enum, int): enum = xrange(enum) size = None if isinstance(enum, Sized):

因此,我尝试使用somo Odoo代码Qweb模板,使其更加具体,我发现了这个函数

def foreach_iterator(base_ctx, enum, name):
    ctx = base_ctx.copy()
    if not enum:
        return
    if isinstance(enum, int):
        enum = xrange(enum)
    size = None
    if isinstance(enum, Sized):
        ctx["%s_size" % name] = size = len(enum)
    if isinstance(enum, Mapping):
        enum = enum.iteritems()
    else:
        enum = izip(*tee(enum))
    value_key = '%s_value' % name
    index_key = '%s_index' % name
    first_key = '%s_first' % name
    last_key = '%s_last' % name
    parity_key = '%s_parity' % name
    even_key = '%s_even' % name
    odd_key = '%s_odd' % name
    for index, (item, value) in enumerate(enum):
        ctx[name] = item
        ctx[value_key] = value
        ctx[index_key] = index
        ctx[first_key] = index == 0
        if size is not None:
            ctx[last_key] = index + 1 == size
        if index % 2:
            ctx[parity_key] = 'odd'
            ctx[even_key] = False
            ctx[odd_key] = True
        else:
            ctx[parity_key] = 'even'
            ctx[even_key] = True
            ctx[odd_key] = False
        yield ctx
    # copy changed items back into source context (?)
    # FIXME: maybe values could provide a ChainMap-style clone?
    for k in base_ctx.keys():
        base_ctx[k] = ctx[k]
这个函数是如何实现t-foreach的,所以它应该在您传递给它的任何内容上创建一个迭代器

但是

>>> list(foreach_iterator({},[1,2,3],"name"))
[{'name': 2,
  'name_even': False,
  'name_first': False,
  'name_index': 1,
  'name_last': True,
  'name_odd': True,
  'name_parity': 'odd',
  'name_size': 2,
  'name_value': 2},
 {'name': 2,
  'name_even': False,
  'name_first': False,
  'name_index': 1,
  'name_last': True,
  'name_odd': True,
  'name_parity': 'odd',
  'name_size': 2,
  'name_value': 2}]
然后

>>> k = foreach_iterator({},[1,2],"name")
>>> k.next()
{'name': 1,
 'name_even': True,
 'name_first': True,
 'name_index': 0,
 'name_last': False,
 'name_odd': False,
 'name_parity': 'even',
 'name_size': 2,
 'name_value': 1}
>>> k.next()
{'name': 2,
 'name_even': False,
 'name_first': False,
 'name_index': 1,
 'name_last': True,
 'name_odd': True,
 'name_parity': 'odd',
 'name_size': 2,
 'name_value': 2}
我已经做了一段时间Python的事情了,所以我知道肯定有遗漏 一些愚蠢的事情,但为了我的生命,我不知道它是什么


有人要吗?提前感谢。

生成器功能正在一次又一次地覆盖ctx引用的同一dict的内容

在测试代码的第二个变体中,内容会在覆盖之间打印出来,因此更改是可见的


这可能是为了进行某种优化,不总是创建新词典,但显然是危险的。

生成器一次又一次地覆盖ctx引用的同一dict的内容。在第二种变体中,内容在覆盖之间打印出来。就是这样!!!你能把你的评论贴出来作为答案来标记它是被接受的吗?我已经这样做了,谢谢。