为什么代码(Python)会给出错误?
在上面的代码中,编译器给出了一个错误,即实例没有dict_dict_2属性,即使它的前缀是self。此外,dict_dict也很好。为了完整起见,我已经包含了整个代码,但问题只存在于支付和游戏方法中?dict_dict_2仅在为什么代码(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
支付()
中创建,因此您必须在尝试调用游戏()之前调用它
问题在于,您只是在支付
函数中创建了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))