如何用迭代器修改iterables的元素?即如何在Python中获得写迭代器?

Hug*_*uge 5 python iterator immutability sequence

我非常喜欢Python语法,但是由于我来自C++,我在Python中没有得到关于迭代器的一点.在C++中有两种迭代器 - 常量和修改(非常量).在python中,似乎(对于我所见过的)只有第一种,如果你想修改元素,你必须使用索引,这对我来说感觉不舒服.让我用一个简单的例子来说明:

ab = ["a", "b"]
for (index, lett) in enumerate(ab):
    print "Firstly, lett is ab[index]?", lett is ab[index]
    lett = str(index)
    print lett
    print ab[index]
    print "But after, lett is ab[index]?", lett is ab[index]
Run Code Online (Sandbox Code Playgroud)

所以我无法使用迭代器修改列表.它只是制作了Lazy副本(见维基百科),正如我在is运营商中发现的那样,有没有办法说我希望它是一个直接修改迭代器而不是使用整齐

for variable in iterable_object:
Run Code Online (Sandbox Code Playgroud)

句法?

Sve*_*ach 9

语法

for x in iterable
Run Code Online (Sandbox Code Playgroud)

不会创建任何惰性副本 - 它会将列表中的确切对象x一个接一个地分配.如果这些对象是可变的,您可以修改它们:

a = [[1, 2], [3, 4]]
for x in a:
    x.append(5)
print a
Run Code Online (Sandbox Code Playgroud)

版画

[[1, 2, 5], [3, 4, 5]]
Run Code Online (Sandbox Code Playgroud)

您的示例使用字符串列表.字符串在Python中是不可变的,因此您无法修改它们.


pha*_*t0m 3

def iset(iterable):
    for i, x in enumerate(iterable):
        def setter(value):
            iterable[i] = value
        yield setter, x
a = range(10)
for set_x, x in iset(a):
    set_x(x * 2)
print a
Run Code Online (Sandbox Code Playgroud)

印刷

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
Run Code Online (Sandbox Code Playgroud)