如何使用类方法修改自定义对象属性

时间:2018-08-07 16:23:55

标签: python python-3.x

Python 3.6中的类,用于跟踪一组计数(通过嵌套字典)和相关概率的numpy ndarray。当我将self.probability元素设置为新值(初始化为0.0)时,可变属性不会更改。使用numpy 1.12。

my_input_fn

以下是输出:

****问题1,8内部循环:1.0

概率1,8外循环0.0

1 个答案:

答案 0 :(得分:0)

MatrixClass实例中self.p的值确实发生了变化。问题在于在函数“ update_probability(self)”中,将p [1] [8]的值设置为1.0,然后在返回之前将其设置为0.0。通过在如下所示的update_probability函数中添加几个打印语句,然后运行它以查看控制台输出可以演示该问题

    def update_probability(self):
        p = self.p
        print("p is ", p)
        for i, t in enumerate(self.tokens):
            total = 0
            for j, s in enumerate(self.sequences):
                total += self.count[t][s]

            if total != 0:
                for s in self.sequences:
                    p[i][j] = self.count[t][s] / float(total)
                    print("Setting p[" + str(i) + "][" + str(j) + "] to " + str(self.count[t][s] / float(total)))
                    print("p is equal to ", p , "\n")
                    if self.count[t][s] > 0:
                        print('****Prob ' + str(i) + ',' + str(j) + ' inner loop: ' + str(p[i][j]))

                if i == 1 and j == 8:
                    print('  Prob ' + str(i) + ',' + str(j) + ' outer loop ' + str(p[i][j]))
        return p

***CONSOLE OUPUT***

Setting p[1][8] to 0.0
p is equal to  [[0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]] 

Setting p[1][8] to 0.0
p is equal to  [[0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]] 

Setting p[1][8] to 0.0
p is equal to  [[0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]] 

Setting p[1][8] to 0.0
p is equal to  [[0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]] 

Setting p[1][8] to 1.0   ###HERE THE VALUE OF P GETS SET TO 1.0
p is equal to  [[0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]] 

****Prob 1,8 inner loop: 1.0
Setting p[1][8] to 0.0
p is equal to  [[0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]] 

Setting p[1][8] to 0.0    ###NOW IT IS BACK TO 0.0 and this is the return value you get
p is equal to  [[0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]] 

Setting p[1][8] to 0.0
p is equal to  [[0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]] 

Setting p[1][8] to 0.0
p is equal to  [[0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]] 

  Prob 1,8 outer loop 0.0

我建议您立即将update_probability方法修改为,它仅将p [1] [8]的值设置为self.count [t] [s] / float(total)等于的任何值。索引i和索引j都没有发生变化。我建议您仔细查看所使用的索引。