编写一个模拟熵变系统的软件,保存时出现循环引用错误。软件使用一个类进行操作,代码很长不用急,主要在保存的这行代码上,那个变量出现循环引用?代码190行,不要着急!
import random
import json
import os
class Main:
def __init__(self):
self.speed = random.uniform(1, 4)
self.data = []
self.size = random.randint(5, 10)
self.data = [[0 for i in range(self.size)] for i in range(self.size)]
self.now = 0
def nock(self):
try:
exec("self.data[self.now]")
except:
return 2
try:
self.data[self.now][-1]
except:
return 1
if self.data[self.now][-1] != 0:
self.now += 1
try:
range(len(self.data[self.now]))
except:
pass
else:
for i in range(len(self.data[self.now])):
if self.data[self.now][i] != 0:
self.data[self.now][i][0] += 1
self.data[self.now][i][1] += random.randint(-1, 1)
if self.data[self.now][i][0] >= self.data[self.now][i][1]:
self.data[self.now][i] = 0
if self.data[self.now][i] != 0:
if self.data[self.now][i][0] > 18:
if self.data[self.now][i][0] / self.data[self.now][i][1] > 0.6:
if self.data[self.now][i-1] != 0:
self.data[self.now][i-1][0] += 10
self.data[self.now][i][0] -= 10
self.data[self.now][i][2].append(self.data[self.now][i-1])
if self.data[self.now][i+1] != 0:
self.data[self.now][i+1] += 10
self.data[self.now][i] -= 10
self.data[self.now][i][2].append(self.data[self.now][i+1])
if not all(self.data[self.now][i][2]):
if self.data[self.now].find(self.data[self.now][i][2]) != -1:
self.data[self.data[self.now].index(self.data[self.now][i][2])][0] += 10
self.data[self.now][i][0] -= 10
def insert(self):
live = self.size / (self.now * self.size / 2 + 1) + random.randint(-5, 5)
index = []
try:
self.data[self.now]
except IndexError:
return 1
for i in range(len(self.data[self.now])):
if self.data[self.now][i] == 0:
index.append(i)
if index != []:
i = random.choice(index)
self.data[self.now][i] = [0, live, [], {}]
for j in range(20):
key = j + 1
value = random.randint(1, 9)
self.data[self.now][i][3][key] = value
def connect(self):
temp1 = []
try:
self.data[self.now]
except IndexError:
return 1
for i in range(len(self.data[self.now])):
if self.data[self.now][i] != 0:
temp1.append(i)
connnum = []
for i in temp1:
connnum.append(len(self.data[self.now][i][2]))
if connnum == []:
return 2
temp3 = min(connnum)
for temp2 in range(len(self.data[self.now])):
if self.data[self.now][temp2] == 0:
return 2
if len(self.data[self.now][temp2][2]) == temp3:
break
big = random.randint(2, 5)
small = -big
for i in range(small, big):
try:
if self.data[self.now][temp2 + i] != 0:
if random.randint(0, 1):
self.data[self.now][temp2][2].append(self.data[self.now][temp2 + i])
except IndexError:
pass
def move(self):
temp1 = []
for i in range(len(self.data[self.now])):
if self.data[self.now][i] != 0:
temp1.append(i)
if temp1 != []:
temp2 = random.choice(temp1)
temp3 = []
for i in range(len(self.data[self.now])):
if self.data[self.now][i] == 0:
temp3.append(i)
temp4 = random.choice(temp1)
self.data[self.now][temp4] = self.data[self.now][temp2]
del self.data[self.now][temp2]
def newinfo(self):
for i in range(len(self.data[self.now])):
if self.data[self.now][i] != 0:
if len(self.data[self.now][i][2]) != 0:
temp = i
break
if "temp" in dir():
for i in os.listdir(r"C:\Users\CK\Desktop"):
if i.find(".txt") != -1:
_data_ = open(rf"C:\Users\CK\Desktop\{i}", encoding="utf-8").read()
break
if "_data_" in dir():
self.data[self.now][temp][3][random.randint(1, 9)] = random.choice(_data_.splitlines())
if "temp" in dir():
if random.choice(self.data[self.now][temp][2]) in self.data[self.now]:
index1 = self.data[self.now].index(random.choice(self.data[self.now][temp][2]))
for i in range(random.randint(5, 10)):
index2 = random.randint(1, 20)
index3 = random.randint(1, 20)
temp1 = self.data[self.now][temp][3][index2]
self.data[self.now][index1][3][index2] = temp1
temp2 = self.data[self.now][index1][3][index2]
self.data[self.now][temp][3][index2] = temp2
self.data[self.now][index1][1] += 1
def run(self):
for i in range(self.size//3*2):
self.insert()
self.nock()
i = 1
for i in range(self.size ** 2):
if self.now > self.size:
return self.data
entropy = 0
for i in range(len(self.data)):
for j in range(len(self.data[i])):
try:
entropy += self.data[i][j][0]
except:
pass
if entropy>self.size**2*self.size/(self.size**2/2)/2:
return self.data
if random.uniform(0, 1) < (self.size / 2) / i:
if self.insert() == 1:
return self.data
if random.uniform(0, 1) < i/self.size:
if self.connect() == 1:
return self.data
if random.uniform(0, 1) < i/self.size/1.75:
self.newinfo()
if random.uniform(0, 1) < i/self.size/2.5:
self.move()
self.nock()
return self.data
if __name__ == "__main__":
x = 0
while True:
with open(r"C:\Users\CK\Desktop\001.num", "r") as f:
num = int(f.read())
with open(r"C:\Users\CK\Desktop\001.num", "w") as f:
f.write(str(num + 1))
while True:
datas = []
try:
main = Main()
datas.append(main.run())
except Exception:
print(f"stop in {x} to save!!!count to {x}...")
break
x = x + 1
print(f"no.{x} made from com.{id(main)}")
with open(fr"C:\Users\CK\Desktop\{num}.json", "w", encoding="utf-8") as f:
for each in datas:
f.write(json.dumps(each))
f.write("\n")
no.1 made from com.31036624
Traceback (most recent call last):
File "D:\工作\客观\软件\开发中\超级模拟器.py", line 189, in <module>
f.write(json.dumps(each))
File "C:\Program Files (x86)\Thonny\lib\json\__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "C:\Program Files (x86)\Thonny\lib\json\encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "C:\Program Files (x86)\Thonny\lib\json\encoder.py", line 257, in iterencode
return _iterencode(o, 0)
ValueError: Circular reference detected
尝试上网查找答案,网上说要找循环引用的变量,但是代码里没找到,帮忙后面一句改好发过来,看看哪里有循环引用,类里面有什么问题。
no.1 made from com.34640432
no.2 made from com.34640368
no.3 made from com.34679408
no.4 made from com.34640368
no.5 made from com.34762352
no.6 made from com.34762448
no.7 made from com.34762352
no.8 made from com.34762448
no.9 made from com.34762352
no.10 made from com.34640368
no.11 made from com.34762352
no.12 made from com.34640368
no.13 made from com.34762352
no.14 made from com.34640368
no.15 made from com.34762352
no.16 made from com.34640368
no.17 made from com.34679408
no.18 made from com.34640368
no.19 made from com.34679408
no.20 made from com.34640368
no.21 made from com.34679408
no.22 made from com.34640368
no.23 made from com.35129712
no.24 made from com.34640368
no.25 made from com.35130384
no.26 made from com.34640368
no.27 made from com.35130960
no.28 made from com.34640368
no.29 made from com.35130960
no.30 made from com.34640368
no.31 made from com.35130992
no.32 made from com.35130960
no.33 made from com.35130992
no.34 made from com.35130960
no.35 made from com.35131280
no.36 made from com.35130992
no.37 made from com.35131280
no.38 made from com.35130992
no.39 made from com.35131280
no.40 made from com.35130992
no.41 made from com.35131280
no.42 made from com.35130992
no.43 made from com.35131280
no.44 made from com.35130992
no.45 made from com.35130960
no.46 made from com.35130992
no.47 made from com.35130960
no.48 made from com.35130992
no.49 made from com.35130960
no.50 made from com.35130992
no.51 made from com.35130960
no.52 made from com.35130992
no.53 made from com.35130960
no.54 made from com.35130992
no.55 made from com.35130960
no.56 made from com.35130992
no.57 made from com.35130960
no.58 made from com.35130992
stop in 58 to save!!!count to 58...
no.59 made from com.35130992
no.60 made from com.35130960
no.61 made from com.35130992
no.62 made from com.35278800
no.63 made from com.35130992
no.64 made from com.35386576
no.65 made from com.35386608
no.66 made from com.35386928
no.67 made from com.35386896
no.68 made from com.35386928
no.69 made from com.35386672
no.70 made from com.35386992
no.71 made from com.35387248
no.72 made from com.35387408
no.73 made from com.35387600
no.74 made from com.35387792
no.75 made from com.35388112
no.76 made from com.35387792
no.77 made from com.35388528
no.78 made from com.35388848
no.79 made from com.35388880
no.80 made from com.35388848
no.81 made from com.35389072
no.82 made from com.35388880
no.83 made from com.35389200
stop in 83 to save!!!count to 83...
no.84 made from com.35389200
no.85 made from com.35389392
no.86 made from com.35389200
no.87 made from com.35389392
no.88 made from com.35389200
no.89 made from com.35389392
no.90 made from com.35389200
no.91 made from com.35389392
no.92 made from com.35389200
no.93 made from com.35389392
no.94 made from com.33970000
no.95 made from com.35389392
no.96 made from com.33970352
no.97 made from com.33970640
no.98 made from com.35389392
no.99 made from com.35386064
no.100 made from com.35389392
no.101 made from com.35386064
no.102 made from com.35389392
no.103 made from com.35386064
no.104 made from com.35389392
no.105 made from com.35386064
no.106 made from com.35389392
stop in 106 to save!!!count to 106...
no.107 made from com.33972112
no.108 made from com.35386032
no.109 made from com.33971984
stop in 109 to save!!!count to 109...
stop in 109 to save!!!count to 109...
no.110 made from com.35386032
...