处理numpy数组时赋值运算符中的类指针行为?

2024-10-04 01:37:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我偶然发现赋值运算符+=的一些奇怪行为,这完全让我感到困惑。请参阅以下代码片段:


import numpy as np

def myalg(data, alpha, beta):

    adash=np.zeros(len(data))
    a=np.zeros_like(adash)
    a_=np.zeros_like(a)
    gain=1
    count=0

    while count<3:
        adash=adash+alpha*np.gradient(data)
        a_old=a
        print( a_old)
        #a+=alpha* (np.gradient(adash)+ alpha* data)
        a=a+alpha* (np.gradient(adash)+  alpha* data)
        print( a_old)
        a/=1+alpha*beta
        #a=a/(1+alpha*beta)
        print( a_old)
        a_=2*a-a_old
        
        gain=la.norm(a-a_old)
        count+=1 
        print(a)
        print(a_)
        print(adash)
        print(gain)

data=np.arange(6)
myalg(data, alpha=0.4, beta=0.25)

我原以为在交换上述备选行的一条“评论”时不会发生任何变化。虽然a-数组在每种情况下都是相同的,但代码确实发生了变化a_old: 当选择a=a+...时,a_old保持不变,无论下面选择了a/=还是a=a/...中的哪一个。 但是,在选择赋值运算符a+=时,a_old的行为类似于指向a的“指针”。因此print(a_old)每次被调用时都会产生a的值,直到a被明确地赋值(例如a= a/...,而不是像+=, -=, *=, /=这样的赋值操作符)

那么为什么阵列会出现这种情况呢

编辑:我知道它是怎么发生的,但我不明白为什么会发生这种情况。 例如,整数或浮点数为什么不出现这种行为


Tags: 代码alphadatacountnpzeros情况运算符
1条回答
网友
1楼 · 发布于 2024-10-04 01:37:29

请查看每行上的注释以了解行为不同的原因(注意:缩进是为了清晰起见,而不是为了编码):

#This points to `a`
a_old=a
print(a_old)

    #This changes `a` inplace so `a_old` will change too
    a+=alpha* (np.gradient(adash)+ alpha* data)
    
    #This creates a NEW `a`, therefore `a_old` will not change
    a=a+alpha* (np.gradient(adash)+  alpha* data)

print(a_old)

    #if you have used `a+=..` this changes `a` inplace again and so `a_old`
    #if you have used `a=a+..` this changes the NEW `a` and NOT the `a_old`
    a/=1+alpha*beta

    #this creates yet another NEWER `a` 
    #and hence `a_old` does not change beyond the LAST print
    a=a/(1+alpha*beta)

print(a_old)

相关问题 更多 >