为什么代码(Python)会出错?

时间:2015-06-23 19:23:22

标签: python class attributes class-method

import numpy as np

import matplotlib.pyplot as plt


class Prisoners_Dilemma:


    def __init__(self,n,p):
        self.n = n
        self.p = p


    def decision_array(self):
        self.dict_dict = {}

        for i in range(1,self.n + 1):
            self.dict_dict[i] = []
            list_list = []

            for j in range(1,self.n):        
                #np.random.seed(j)
                self.r = np.random.uniform(0,1)

                if self.r > self.p:
                    q = 0

                else:
                    q = 1

                list_list.append(q)                
                self.dict_dict[i] = list_list

        return self.dict_dict


    def payoff(self):
        self.dict_dict_2 = {}

        for i in range(1,self.n + 1):
            self.dict_dict_2[i] = []
            list_list_2 = []
            list_list_3=[]

            for j in range(1, i):
                    list_list_2.append(self.dict_dict[j][i-2])

            for j in range(i + 1, self.n + 1):
                    list_list_2.append(self.dict_dict[j][i-1])



            list_list_2_np = np.array(list_list_2)
            against_i = np.sum(list_list_2_np)
            for_i = np.sum(self.dict_dict[i]) 

            if against_i == 0 and for_i == 0:
                payoff_i = 2

            elif against_i == 0 and for_i != 0:
                payoff_i = 5

            elif against_i != 0 and for_i == 0:
                payoff_i = -5

            else:
                payoff_i = -2

            list_list_3.append(payoff_i)

            self.dict_dict_2[i]=list_list_3

        return self.dict_dict_2


    def gameplay(self, N, initial_count):

        self.counter = initial_count

        for i in range(N):
            for j in range(1, self.n + 1):
                z = self.dict_dict_2[j]
                x = np.array(z)


                self.counter += np.sum(z)
        return self.counter

y = Prisoners_Dilemma(15,0.015)

print (y.gameplay(20,100))

在上面的代码中,编译器给出了一个错误,即实例没有属性为dict_dict_2,即使它以self为前缀。而且,dict_dict完全没问题。为了完整起见,我已经包含了整个代码,但问题仅在于支付和游戏方法?

2 个答案:

答案 0 :(得分:2)

dict_dict_2 仅在<{1}}中创建,因此您必须在尝试呼叫payoff()之前调用

答案 1 :(得分:0)

问题是您只在self.dict_dict_2函数中创建payoff变量,但在您调用gameplay()函数的逻辑中,您没有调用payoff()函数在访问dict_dict_2之前的函数,从它的外观来看,你根本不会在任何地方调用该函数。

不确定dict_dict_2是什么,但上面是您遇到问题的原因,也许您可​​以将dict_dict_2的初始化部分移动到__init__()函数,尽管如此不能解决完整问题,因为如果dict_dict_1[j]不是j中的密钥,您仍然会尝试访问dict_dict_2,这可能会导致错误。