为什么我的循环中的循环只打印列表长度的一半?

Why is my loop in a loop only printing half the list length?

我有一个包含 60 个元素的列表,CashFlow。我正在构建一个新列表 ListNPV,其中每个元素都是使用原始 CashFlow 中的每个元素的方程式的结果。将总和添加到新列表后,我从原始 CashFlow 中删除了一个元素。

当我 运行 这个时,它恰好完成了列表的一半,所以有 30 个值。我将代码加倍以确保,结果从 30 / 30 下降到 15 / 45。我想要 0 / 60。使用 Canopy。

 for payment in CashFlow:  
    NPV = 0 
    for i in range(len(CashFlow)):    
        NPV += CashFlow[i] / (1+MonthlyInterest)**i
        NPV = round (NPV, 0)
    ListNPV.append(NPV)
    CashFlow.remove(payment)
print 'CashFlow = ', CashFlow
print 'ListNPV =', ListNPV

由于以下行

 CashFlow.remove(payment)

上一行会影响 CashFlow.Remove 这一行的长度,您的所有迭代都将完成。之后就可以单独去掉现金流列表了。

the python docs 开始,您不应更改正在迭代的列表:

If you need to modify the sequence you are iterating over while inside the loop (for example to duplicate selected items), it is recommended that you first make a copy. Iterating over a sequence does not implicitly make a copy.

在这种情况下,您甚至不使用循环变量 payment,因此您可以稍微清理一下循环。这应该有效:

N = len(CashFlow)
for j in range(N):
    NPV = 0 
    for i in range(j, N):
        NPV += CashFlow[i] / (1+MonthlyInterest) ** (i - j)
        NPV = round (NPV, 0)
    ListNPV.append(NPV)

print 'CashFlow = ', CashFlow
print 'ListNPV =', ListNPV