现在我知道在迭代循环期间修改列表是不安全的.但是,假设我有一个字符串列表,我想自己去除字符串.替换可变值是否算作修改?
我正在尝试学习Python,我开始使用一些代码:
a = [3,4,5,6,7]
for b in a:
print a
a.pop(0)
Run Code Online (Sandbox Code Playgroud)
输出是:
[3, 4, 5, 6, 7]
[4, 5, 6, 7]
[5, 6, 7]
Run Code Online (Sandbox Code Playgroud)
我知道在我循环的时候改变数据结构并不是一个好的做法,但我想了解Python在这种情况下如何管理迭代器.
主要问题是:如果我改变状态,它如何知道它必须完成循环a?
在下面的代码中,第一种类型的修改改变了原始列表,而在第二个列表中保持不变。为什么行为是这样?
temp = [{"a":"b"},{"c":"d"},{"e":"f"},{"a":"c"}]
for item in temp:
if "a" in item:
item["a"] = "x"
print(temp)
Run Code Online (Sandbox Code Playgroud)
temp = [{"a":"b"},{"c":"d"},{"e":"f"},{"a":"c"}]
for item in temp:
item = {}
print(temp)
Run Code Online (Sandbox Code Playgroud)
第一个的输出是 [{'a': 'x'}, {'c': 'd'}, {'e': 'f'}, {'a': 'x'}]
第二个是 [{'a': 'b'}, {'c': 'd'}, {'e': 'f'}, {'a': 'c'}]
Python 版本是 3.6.5
在 Python 中,迭代列表时无法修改列表。例如,下面我无法修改list_1,并且结果print将是[0, 1, 2, 3, 4]。在第二种情况下,我循环遍历类实例列表,并调用该set_n方法修改列表中的实例,同时迭代它。确实,意志print给予[4, 4, 4, 4, 4]。
这两个案例有何不同,为什么?
# First case: modify list of integers
list_1 = [0, 1, 2, 3, 4]
for l in list_1:
l += 1
print(list_1)
# Second case: modify list of class instances
class Foo:
def __init__(self, n):
self.n = n
def set_n(self, n):
self.n = n
list_2 = [Foo(3)] * 5
for l in list_2:
l.set_n(4)
print([l.n for …Run Code Online (Sandbox Code Playgroud)