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)
句法?
语法
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中是不可变的,因此您无法修改它们.
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)