Python:分配“通过”迭代器

Posted

技术标签:

【中文标题】Python:分配“通过”迭代器【英文标题】:Python: Assigning "through" an iterator 【发布时间】:2013-11-02 22:47:03 【问题描述】:

我有一个可变序列的迭代器,例如

foo = [1, 2, 3, 4, 5]
for bar in foo:

有没有办法通过使用迭代器中包含的引用来写入 foo 中的元素?天真的作业:

   bar = 42

当然不行。是否可以对迭代器中的序列元素使用“幕后”引用?

PS:使用索引的简单解决方案

for i in range(len(a)):
   a[i] = 42

不适用于我的情况,因为我无法公开容器名称。

【问题讨论】:

不能暴露容器名?您的for 循环需要引用,因此要返回原始容器,您只需要相同的引用 @MartijnPieters 想象一下,这是一个从真正的容器所在的类中出来的迭代器。迭代器不会让我自己下标。 在这种情况下,您无法无论如何更改容器。可以从许多不同的位置引用 Python 对象; bar 是一个这样的引用,foo 引用的列表是另一个。哪一个是您想在此处重新绑定的“真实”参考?如果我将foo 列表复制到另一个列表中,对42 的引用是否也应该在该列表中反弹? 该类持有一个引用列表的名称。这个列表是我要修改的。我想做 myobject.foo[i]=42,但是通过刚刚在 myobject.foo[] 上运行的迭代器。仅通过手头的“指向”元素本身的“指针”来显式地重新矢量列表元素(技术上是指针)似乎是不可能的。您似乎总是需要在 Python 中引用列表的开头,对吗? 你做的;因为列表中的值是不可变的,所以您需要重新绑定列表中的索引以指向 new 对象。 python 列表只是一个引用序列,就像变量名一样,尽管是通过索引而不是名称访问的。 【参考方案1】:

据我了解,您的用例是这样的:

class Z:
    def __init__(self):
        self.a, self.b, self.c = 1, 2, 3

    def it(self):
        for x in self.a, self.b, self.c:
            yield x

z = Z()
for x in z.it():
    if x == 1:
       x = 42 # z.a should be 42? - doesn't work!

这在 python 中是不可能的——没有“指针”或“引用”数据类型。您可以通过生成一个 setter 函数而不是(或连同)该值来解决此问题:

class Z:
    def __init__(self):
        self.a, self.b, self.c = 1,2,3

    def it(self):
        for x in 'abc':
            yield getattr(self, x), lambda y: setattr(self, x, y)

z = Z()
for x, setter in z.it():
    if x == 1:
       setter(42) # works!

【讨论】:

我试图解决的用例是“读取元素并在满足条件时修改(覆盖)它”,所以我需要一个迭代器来产生读取和写入功能。这可以工作...谢谢,不错的! :)【参考方案2】:

你可以使用list comprehension:

foo[:] = [expression for bar in foo]

或者,如果赋值对于表达式来说过于复杂,您可以使用函数func

foo[:] = [func(bar) for bar in foo]

如果您只有一个迭代器,那么就无法将值重新分配给底层容器,因为甚至无法保证存在底层容器:

def generator():
    for i in range(10):
        yield i

for bar in generator():
    # Nothing you put here can change what's going on in generator

【讨论】:

【参考方案3】:

使用enumerate() 在循环中为您生成索引:

for i, bar in enumerate(foo):
    foo[i] = bar + 42

【讨论】:

以上是关于Python:分配“通过”迭代器的主要内容,如果未能解决你的问题,请参考以下文章

python三大器之迭代器

python-迭代器

Python基础之迭代器

Python函数-4 迭代器

Python三大器之迭代器

python迭代器