Python没有正确使用变量值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python没有正确使用变量值相关的知识,希望对你有一定的参考价值。

我写了以下代码。发生了一些非常奇怪的事情。我有2个变量,当我打印它们时,我得到值sums[d_index][k]=[0 0]rewards[k]=[1]。因此当我为sums[d_index][k] = sums[d_index][k]+rewards[k]执行k=0时,我应该期待获得sums[d_index][k]=[1 0]。但由于一些荒谬的原因,我得到了sums[d_index][k]=[0.2 0]。我不知道这到底怎么可能。为什么会发生这种情况,我该如何解决?

我用评论#HERE!!!!标记了问题行

import numpy as np
import math 

e = 0.1
np.random.seed(2)

#Initializing the parameters of the bernoulli distributions randomly
p = np.random.rand(1,2)[0]
#>>>>>>>>>>> p = np.array([ 0.26363424, 0.70255294])
suboptimality_gap = np.max(p)-p
print p

powers = [1]
cumulative_regret = np.zeros((len(powers),1,10))
for round_number in range(1):
    #Initializing the arrays to store the estimate and sum of rewards, and count of each action
    estimates = np.zeros((len(powers),2))
    estimates[:,0] = np.random.binomial(1, p[0], 1)
    estimates[:,1] = np.random.binomial(1, p[1], 1)
    counts = np.ones((len(powers),2))
    sums = estimates[:]
    #Updating estimates for action at time t>K=2
    for t in range(1,10):
        rewards = np.array([np.random.binomial(1, p[0], 1),np.random.binomial(1, p[1], 1)])
        for d_index,d in enumerate([1./(t**power) for power in powers]):
            #print (np.asarray([(estimates[d_index][i]+((2*math.log(1/d))/(counts[d_index][i]))**0.5) for i in [0,1]]))
            k = np.argmax(np.asarray([(estimates[d_index][i]+((2*math.log(1/d))/(counts[d_index][i]))**0.5) for i in [0,1]]))
            counts[d_index][k] = counts[d_index][k]+1
            print "rewards=",rewards[k]
            print "sums=",sums[d_index]
            sums[d_index][k] = sums[d_index][k]+rewards[k] #HERE!!!!
            estimates[d_index] = np.true_divide(sums[d_index], counts[d_index])
            cumulative_regret[d_index][round_number][t]=cumulative_regret[d_index][round_number][t-1]+suboptimality_gap[k]
    #print counts

输出:

[ 0.4359949   0.02592623]
rewards= 0
sums= [ 0.  0.]
rewards= 0
sums= [ 0.  0.]
rewards= 0
sums= [ 0.  0.]
rewards= 0
sums= [ 0.  0.]
rewards= 0
sums= [ 0.  0.]
rewards= 0
sums= [ 0.  0.]
rewards= 1
sums= [ 0.  0.]
rewards= 1
sums= [ 0.2  0. ]
rewards= 0
sums= [ 0.2  0. ]

我很抱歉我的代码有点没有组织。但那是因为我一直试图在最后一小时调试问题。

答案

正如您的问题的评论中所提到的,sums = estimates不会创建数组的新副本,只是指向原始对象的新引用,这会导致事情变得混乱。要获得所需的结果,您可以使用:

sums = estimates.copy()

以上是关于Python没有正确使用变量值的主要内容,如果未能解决你的问题,请参考以下文章

如何为每个片段保存一个变量值以重用它? [关闭]

有没有办法在python中保存变量值如果树莓派电源出现故障?

Python 中如何打印变量值

arm-none-eabi 全局初始化变量值不正确

Python交换两个变量值的函数

使用Eclipse,MyEclipse测试的时候如何查看变量值?