【问题标题】:Python: Storing value of self VariablePython:存储自变量的值
【发布时间】:2020-09-01 12:59:56
【问题描述】:

我在将变量 self.data_counter 存储在另一个变量(例如 prev_counter_data)中时遇到了问题。 我根本无法存储当前值 - 我分配给 self.data_counter 的变量总是以某种方式具有完全相同的值。

class SimpleSwitch(app_manager.RyuApp):

    def __init__(self, *args, **kwargs):
        super(SimpleSwitch, self).__init__(*args, **kwargs)
        self.data_counter = {}
        self.monitor_thread = hub.spawn(self._monitor)

    def _monitor(self):
        timer = 0
        prev_data_counter = self.data_counter
        while True:
            hub.sleep(5)
            timer = timer + 5
            # assign current values to self.data_counter in func()
            func()
            # compare current values to previous values

            if (timer%60) == 0:
                prev_data_counter = self.data_counter

知道我的想法的缺陷在哪里吗?为什么prev_data_counter 总是等于self.data_counter

字典self.data_counter包含诸如[(id, port):traffic]之类的信息。我可以通过self.data_counter[id][port] = traffic 赋值。

【问题讨论】:

  • self.data_counter 在 while 循环中不断变化。 prev_data_counter 应每 60 秒更新一次,以匹配 self.data_counter 的值。

标签: python variables updates store self


【解决方案1】:

您的数据计数器是字典。字典是可变对象。当您将 self.data_counter 分配给 prev_data_counter 时,您实际上只是将引用保存到同一个字典对象。因此,当您更新 self.data_counter 时,您也会更新 prev_data_counter - 它们引用的是同一个对象。

您需要创建字典的副本:

prev_data_counter = self.data_counter.copy()

【讨论】:

  • 在尝试读取复制的字典时,使用它会引发 KeyError。 self.data_counter[id][port] 工作正常。 prev_data_counter[id][port] 为端口条目抛出一个关键错误。
【解决方案2】:

当您使用self.prev_data_counter = self.data_counter 时,我们说它们是同一个对象。

试试:

self.prev_data_counter = copy.copy(self.data_counter)

并添加复制包:import copy

另请参阅: https://docs.python.org/2/library/copy.html

【讨论】:

  • 谢谢!这可能是一个有效的解决方案。有什么方法可以在不导入其他包的情况下分配值?
  • 如果您的变量是整数,您可以使用一个肮脏的技巧,即从变量中加减一个,例如然后是a=1,然后是b=a+1,然后是b=b-1。然后,注意ab 是不同的对象。无论如何,这取决于 self.data_counter 的类型。
  • 在尝试读取复制的字典时,使用 copy.copy() 和 copy.deepcopy() 仍然是 KeyError。 self.data_counter[id][port] 工作正常。 prev_data_counter[id][port] 为端口条目抛出一个关键错误。
  • @JaboSammy, copy.deepcopy() 在这里作为通用字典工作得很好。 dir(prev_data_counter[id]) 的输出是什么?
  • 显然ID也是KeyError。
猜你喜欢
  • 2015-04-07
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
  • 1970-01-01
相关资源
最近更新 更多