Python中的循环无法更新数组,为什么?

时间:2018-12-21 18:54:38

标签: python numpy

以下代码不会更新数组V。该数组首先在循环之前创建,并且应该在循环内进行更改,但不会。有人可以解释为什么吗?

PS:我是Python的初学者。

import numpy as np
def priceCall(S0=4,u=2,d=0.5,T=1,r=0.25,K=5):
    n = range(T+1);
    Tmn = np.subtract(T,n);
    S = S0*np.power(u,Tmn)*np.power(d,n);
    p = (1+r-d)/(u-d);
    V = np.maximum(np.subtract(S,K),[0]*len(S));
    for j in range(1,T+1):
        for i in range(1,len(V)-j):
            V[i] = 1/(1+r)*(p*V[i]+(1-p)*V[i+1]);
    print(V)        
    return V

2 个答案:

答案 0 :(得分:1)

因为您的第二个forloop甚至没有执行。假设您要不带任何参数调用priceCall,在这种情况下,这意味着第一个范围将是range(1, 2),这实际上意味着[1]j=1循环,表示第二个范围将是range(1, 1),实际上意味着[],因为将始终排除范围中的结束索引。

这是我测试的方式:

import numpy as np

def priceCall(S0=4,u=2,d=0.5,T=1,r=0.25,K=5):
    n = range(T+1);
    Tmn = np.subtract(T,n);
    S = S0*np.power(u,Tmn)*np.power(d,n);
    p = (1+r-d)/(u-d);
    V = np.maximum(np.subtract(S,K),[0]*len(S));

    print("INITIAL")
    print(V)


    print("R1")
    print(range(1, T+1))
    for j in range(1, T+1):
        print("R2")
        print(range(1, len(V)-j))
        for i in range(1, len(V)-j):
            new_val = 1/(1+r)*(p*V[i]+(1-p)*V[i+1])
            print(new_val)
            V[i] = new_val

    print("AFTER")
    print(V)        
    return V

priceCall()

这是输出:

(py3) > $ python sover.py                                                                                                                                                                                  
INITIAL
[3. 0.]
R1
range(1, 2)
R2
range(1, 1)
AFTER
[3. 0.]

证明向量确实发生了变化:

import numpy as np

def priceCall(S0=4,u=2,d=0.5,T=1,r=0.25,K=5):
    n = range(T+1);
    Tmn = np.subtract(T,n);
    S = S0*np.power(u,Tmn)*np.power(d,n);
    V = np.maximum(np.subtract(S,K),[0]*len(S));

    print("INITIAL")
    print(V)

    V[0] = 9999

    print("AFTER")
    print(V)

priceCall()

与输出

(py3) > $ python sover.py                                                                                                                                                                                  
INITIAL
[3. 0.]
AFTER
[9999.    0.]

答案 1 :(得分:0)

在嵌套的for循环中出现一个错误。进入第一个循环时,len(V)等于1。