Python:分配"通过"迭代器

Vro*_*del 7 python iterator reference variable-assignment

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

foo = [1,2,3,4,5]
for bar in foo:
Run Code Online (Sandbox Code Playgroud)

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

   bar = 42
Run Code Online (Sandbox Code Playgroud)

当然不起作用.是否可以使用"幕后"引用迭代器中的序列元素?

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

for i in range(len(a)):
   a[i] = 42
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 17

使用enumerate()生成的循环为您指数:

for i, bar in enumerate(foo):
    foo[i] = bar + 42
Run Code Online (Sandbox Code Playgroud)


geo*_*org 8

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

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!
Run Code Online (Sandbox Code Playgroud)

这在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!
Run Code Online (Sandbox Code Playgroud)


unu*_*tbu 5

您可以使用列表理解

foo[:] = [expression for bar in foo]
Run Code Online (Sandbox Code Playgroud)

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

foo[:] = [func(bar) for bar in foo]
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)