关于python:对象保留了之前循环迭代的信息

Objects retain info from previous loop iteration

本问题已经有最佳答案,请猛点这里访问。

我有一个名为run_c的类,用于初始化和执行运动学模拟的运行。在执行run_c.__init__()之前,我将默认值分配给run_c的属性,例如x的属性。__init__()所做的全部工作是提取用户输入值,聚合到字典中,并将它们分配给run_c中的相应属性(如果存在)。例如。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import vars.Defaults as dft
class run_c:

   ...
   dt     = dft.dt
   x      = dft.x0
   states = [ [], [], [], [] ]
   ...

   def __init__(self, input):
      for key in input.keys():
         if hasattr(self, key): setattr(self, key, input[key])
      ...
      self.execute()

run_c.states是一个列表,用于记录run_c属性值随时间步长的变化。后来,在run_c.execute()中,我在states[1]中存储x值,增加dt的时间步,并使用速度和时间步更新x。这很简单,对吧?…

不过,问题就在这里开始了。第一次创建、初始化和执行run_c的实例时,它运行得很好。但是,我通过创建、初始化和执行基于从JSON文件读取的列表之外的多次运行来操作这个模拟。因此,在驱动模块中…

1
2
3
4
5
6
7
from Run import run_c
def main():
   ...
   for runEntry in runList:
      currRun = run_c(runEntry)
      ...
   ...

实际情况是,在循环的每次迭代之后,存储在run_c.states中的所有值都不会被擦除。我认为每次运行循环时都会创建新的run_c实例,以便用新的信息执行__init__()。为什么在每个循环结束后保留数据值,如x的旧值?

更新:当我添加一行代码将states的值重置回__init__()中的空列表时,问题就消失了。但这不应该是我想做的事情中的一个必要步骤…应该吗?


定义为类别变量,而不是实例变量。你创造的每一个阶级都会分享他们。如果你需要他们每一次创建一个新的论坛,这正是__init__()的目的:

1
2
3
4
5
6
7
8
9
10
11
12
13
class run_c:

   def __init__(self, input):
      ...
      self.dt     = dft.dt
      self.x      = dft.x0
      self.states = [ [], [], [], [] ]
      ...

      for key in input.keys():
         if hasattr(self, key): setattr(self, key, input[key])
      ...
      self.execute()

加上现有的答案:您可以在EDOCX1&4中初始化这些变量。

ZZU1

如果你重新点击__new__,则输出为1 1和其他1 2