有始无终的项目 2022-01-22 20:56 采纳率: 33.3%
浏览 17
已结题

熵变模拟软件出现循环引用但不能发现

    编写一个模拟熵变系统的软件,保存时出现循环引用错误。软件使用一个类进行操作,代码很长不用急,主要在保存的这行代码上,那个变量出现循环引用?代码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
...
  • 写回答

2条回答 默认 最新

  • 关注

    你这个 self.data[self.now][i][2].append(self.data[self.now][i-1])
    self.data中数据肯定会出现循环引的

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月31日
  • 已采纳回答 1月23日
  • 创建了问题 1月22日

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题