我有一个可变序列的迭代器,例如
foo = [1,2,3,4,5]
for bar in foo:
有没有办法通过使用迭代器中包含的引用来写入foo中的元素?天真的任务:
bar = 42
当然不起作用。是否可以使用“幕后”引用迭代器中的序列元素?
PS:使用索引的简单解决方案
for i in range(len(a)):
a[i] = 42
对我的情况不起作用,因为我无法公开容器名称。
答案 0 :(得分:17)
使用enumerate()
在循环中为您生成索引:
for i, bar in enumerate(foo):
foo[i] = bar + 42
答案 1 :(得分: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!
这在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 :(得分:4)
您可以使用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