kking1 发表于 2023-3-12 16:26:58

类的相等问题与deepcopy

                  test1_solution = copy.deepcopy(self.solution)
                  before_change_successful_task_num = check.returnTotalNumSuccessfulTask(self.solution)
                  print('before_num',before_change_successful_task_num)
                  current_task1.setImageChance(optional_image_chance_list1)
                  current_task2.setImageChance(optional_image_chance_list2)
                  test2_solution = copy.deepcopy(self.solution)
                  l = 0
                  for k in range(len(self.solution)):
                        print(len(self.solution))
                        if(test1_solution.getImageChance() == test2_solution.getImageChance()):
                            l += 1
                        #else:
                        #    if(test1_solution.getImageChance() != None):
                        #      print('test1_sloution',test1_solution.id,test1_solution.getImageChance().id)
                        #      print('test2_sloution',test2_solution.id,test2_solution.getImageChance().id)
                        #    else:
                        #      print('test1_sloution',test1_solution.id,test1_solution.getImageChance())
                        #      print('test2_sloution',test2_solution.id,test2_solution.getImageChance())
                  print('l',l)

截取了代码了一段,self.solution是由current_task元素构成的长度为6000的列表,current_task1和current_task2是其中的两个元素,setImageChance这个函数改变了元素的某个属性,上述代码总共改变了两个元素的属性,改变前后均deepcopy了一份,按理来说后续打印出来的l应该是5998,但是运行发现结果为100多,求大佬指教

kking1 发表于 2023-3-12 16:27:54

getImageChance运行完会得到一个类,这个类的相等是用默认的方法,没有自定义类相等

小甲鱼的二师兄 发表于 2023-3-31 00:04:55

根据您提供的代码和注释,可以看到在循环中比较了test1_solution和test2_solution两个深拷贝后的列表中元素属性值是否相等。如果属性值相等,则将计数器l加一。

但是从代码中无法确定check.returnTotalNumSuccessfulTask(self.solution)函数的具体实现以及current_task、optional_image_chance_list等其他变量的定义和赋值情况,这些因素均可能对结果产生影响。因此需要更多上下文信息来判断问题的具体原因。
页: [1]
查看完整版本: 类的相等问题与deepcopy