【问题标题】:Python dictionary reseting outside of loopPython字典在循环外重置
【发布时间】:2013-04-03 14:36:40
【问题描述】:

我正在构建一个生物模拟器。它将在两个 for 循环中运行,一个跟踪一天,一个跟踪一天中的时间。我有一本关于我所有生物的字典,叫做 awake,它是在每天开始时设置的。在一天循环中的某个时间点,生物会变得疲倦并入睡。模拟将它们从唤醒字典中删除,以便在一天中的剩余时间循环中不会考虑它们。但问题是,由于某种原因,唤醒字典会随着一天中的每个时间循环而重置,以便访问沉睡的生物。我已经在这里发布了相关代码,这是唯一一次使用 awake 。谁能解释我做错了什么?

        for i in range(self.Day):
            start = clock()
            awake = self.creatures
            for j in range(self.timeOfDay):          
                print("Life Time " + str(i + 1) + "/" + str(self.Day) 
                       + " Hour " + str(j + 1) + "/" + str(self.timeOfDay))
                print(self)
                traveling = []
                for creature in awake:
                    goal = None
                    while goal == None:
                        priority = creature.priority()
                        if priority == "improveShelter":
                            goal = creature.findBest(land.Shelter, self.map)
                        elif priority == "sleep":
                            goal = creature.findBest(land.Shelter, self.map)
                            print(awake)
                            awake.pop(creature)

【问题讨论】:

    标签: python for-loop dictionary


    【解决方案1】:

    您正在循环遍历awake 并同时对其进行修改。这意味着某些项目将被跳过

    创建awake副本,而不是断开循环迭代器与awake 的连接,这样您就可以在不影响循环的情况下修改后者:

    for creature in list(awake):
    

    然而,您最大的问题是您在循环开始时将awake 设置为self.creatures,从而有效地更改了self.creatures。也许您打算改用self.awake

    【讨论】:

      【解决方案2】:

      每天开始时,您需要复制creaturesdict 而不是引用它:

      awake = dict(self.creatures)
      

      这是 Python 中各种可变类型的常见陷阱。

      Python 只有对对象的引用,而不是像“变量”这样的东西。所以写a=b 只是为b 已经引用的同一个对象创建一个名为a 的新引用。

      【讨论】:

      • 糟糕。看起来我暂时忘记了python使用引用。
      猜你喜欢
      • 1970-01-01
      • 2018-02-22
      • 2018-09-29
      • 1970-01-01
      • 2021-11-07
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      • 2014-02-14
      相关资源
      最近更新 更多