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

为什么代码(Python)会给出错误?,python,class,attributes,class-method,Python,Class,Attributes,Class Method,在上面的代码中,编译器给出了一个错误,即实例没有dict_dict_2属性,即使它的前缀是self。此外,dict_dict也很好。为了完整起见,我已经包含了整个代码,但问题只存在于支付和游戏方法中?dict_dict_2仅在支付()中创建,因此您必须在尝试调用游戏()之前调用它问题在于,您只是在支付函数中创建了self.dict_2变量,但在您调用gameplay()函数的逻辑中,在访问支付函数之前,您没有调用支付函数,从外观上看,您根本没有在任何地方调用该函数 不确定什么是dict\u di

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

dict_dict_2仅在
支付()
中创建,因此您必须在尝试调用
游戏()之前调用它

问题在于,您只是在
支付
函数中创建了
self.dict_2
变量,但在您调用
gameplay()
函数的逻辑中,在访问
支付
函数之前,您没有调用
支付
函数,从外观上看,您根本没有在任何地方调用该函数


不确定什么是
dict\u dict\u 2
有效,但以上就是您遇到问题的原因,也许您可以将
dict\u dict\u 2
的初始化部分移动到
\u init\u()
函数,尽管这不会解决整个问题,因为您仍将尝试访问
dict\u dict\u 1[j]
如果
j
不是
dict\u dict\u 2

中的一个键,那么哪个会出错呢?然后你能解释一下为什么dict\u dict变量没有这样的问题吗?你根本没有在游戏中的任何地方访问
dict\u dict
变量,你可以尝试在那里访问它(只需执行简单的
打印(self.dict\u dict)
)你也会在游戏中看到错误。我在decision_matrix中调用了dict_dict,并在payoff中使用它,没有任何特殊语法,但它仍然可以正常工作,并给出列表(如果您尝试通过注释游戏性部分来运行代码)。您正在定义
dict_dict
decision_matrix
的开头,定义的行是-
self.dict_dict={}
,这在
self
内部定义了变量
dict\u dict
。然后,您能否解释为什么dict\u dict变量有效(请参见支付和决策矩阵)?它“有效”是偶然的,因为您从未访问过它。
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))