在我的程序中,我有很多行,我需要迭代并在同一个for
循环中修改它。
但是,我知道修改你正在迭代的东西是不好的,因为可能 - 可能将 - 导致不希望的结果。
所以我一直在做这样的事情:
for el_idx, el in enumerate(theList):
if theList[el_idx].IsSomething() is True:
theList[el_idx].SetIt(False)
这是最好的方法吗?
答案 0 :(得分:1)
这是一个概念上的误解。
从迭代中修改列表本身是危险的,因为Python将循环转换为较低级别的代码。这可能会在迭代过程中产生意想不到的副作用,这里有一个很好的例子:
https://unspecified.wordpress.com/2009/02/12/thou-shalt-not-modify-a-list-during-iteration/
但是修改存储在列表中的可变对象是可以接受的,也是常见的做法。
我怀疑您是否认为因为列表由这些对象组成,修改这些对象会修改列表。这是可以理解的 - 它不是通常的想法。如果有帮助,请考虑该列表仅包含对这些对象的引用。当您修改循环中的对象时 - 您只是使用列表来修改对象,而不是修改列表本身。
您不应该做的是在迭代期间从列表中添加或删除项目。
答案 1 :(得分:0)
我的问题似乎不清楚。但是如果我们在Python中的for
循环迭代期间讨论修改列表的有害问题。我可以考虑两种情况。
首先,您修改列表中的一些元素,这些元素假设在下一轮计算中用作其原始值。
e.g。你想编写一个具有这些输入和输出的程序。
输入:
[1, 2, 3, 4]
预期产出:
[1, 3, 6, 10] #[1, 1 + 2, 1 + 2 + 3, 1 + 2 + 3 + 4]
但是......你用这种方式编写代码:
#!/usr/bin/env python
mylist = [1, 2, 3, 4]
for idx, n in enumerate(mylist):
mylist[idx] = sum(mylist[:idx + 1])
print mylist
结果是:
[1, 3, 7, 15] # undesired result
第二次,您在for
循环迭代期间对列表大小进行了一些更改。
e.g。来自python-delete-all-entries-of-a-value-in-list:
>>> s=[1,4,1,4,1,4,1,1,0,1]
>>> for i in s:
... if i ==1: s.remove(i)
...
>>> s
[4, 4, 4, 0, 1]
该示例显示了在列表中更改大小的副作用引起的不良结果。这显然表明,for
Python中的每个循环都无法以正确的方式处理动态大小的列表。下面,我将向您展示一些解决此问题的简单方法:
#!/usr/bin/env python
s=[1, 4, 1, 4, 1, 4, 1, 1, 0, 1]
list_size=len(s)
i=0
while i!=list_size:
if s[i]==1:
del s[i]
list_size=len(s)
else:
i=i + 1
print s
结果:
[4, 4, 4, 0]
结论:在循环迭代期间修改列表中的任何元素绝对没有害处,如果你不1)改变列表的大小2)制作一些你自己计算的副作用。
答案 2 :(得分:-1)
你可以先获得索引
// But this does...
childCtrl.test = $scope.parentCtrl.test;