【问题标题】:Assigning NoneType to Dict将 NoneType 分配给 Dict
【发布时间】:2023-03-14 08:19:01
【问题描述】:

我正在尝试将 None 分配给 dict 中的键,但我收到 TypeError:

self._rooms[g[0]] = None
TypeError: 'NoneType' object does not support item assignment

我的代码在这里:

r = open(filename, 'rU')
    for line in r:
        g = line.strip().split(',')
        if len(g) > 1:
            r1 = g[0]
            h = Guest(g[1], str2date(g[2]), str2date(g[3]))
            self._rooms.set_guest(r1, h)
        else:
            self._rooms[g[0]] = None
    r.close()

之前它会让我分配,但不是它不会。很奇怪:/

【问题讨论】:

  • 很好的问题+1,你问了一个明确的问题,给了我们一个代码 sn-p 没有淹没我们,给了我们一个明确的回溯!
  • 这看起来与昨天的这篇帖子非常相似,stackoverflow.com/questions/10600746/…。这是作业题吗?
  • 另外,这里要小心。 Stackoverflow 不适合编辑 python 代码——前两行之间的缩进不太正确;)——如果每次我的 python 缩进在 SO 上出错时我都会得到一个镍,我可能会有几美元现在...

标签: python list dictionary typeerror nonetype


【解决方案1】:

异常明确指出TypeError: 'NoneType' object does not support item assignment 这表明self._rooms 实际上是None

编辑: 正如你自己所说的

self._rooms = {} 

或

self._rooms = dict()

会做你需要清除字典的事情

【讨论】:

  • 或者更可能是self._rooms[g[0]],因为没有引发“'NoneType' 对象不可订阅”TypeError。
  • 试试None[3]=4 在你的解释器中你会得到完全相同的异常^^
  • 我的立场是正确的!不过,这对我来说似乎很奇怪。感觉需要先评估非法下标,然后 Python 才能确定我们正在尝试分配给 None。
  • 'd = self._rooms self._rooms = d.clear()',这是为了在我加载文件时清除我的字典。如果我只是将它设置为 'self._rooms = dict()' 会做同样的事情吗?
  • @JakobBowyer d.clear() 和 d={} 并不完全等价——尤其是如果 d 是 dict 的子类(这似乎是因为它有一个 set_guest 方法) .此外,如果其他对象引用 d(在这种情况下可能不太可能),情况也不一样。
【解决方案2】:

它可能在抱怨self._rooms,我怀疑是None。

【讨论】:

    【解决方案3】:

    检查self._rooms 不是None。

    将None 作为值分配给dict 的键实际上有效:

    In [1]: dict(a=None)
    Out[1]: {'a': None}
    

    【讨论】:

      【解决方案4】:

      从阅读你的 cmets 到 Jakob,我推测罪魁祸首是这条线(未发布)

      d = self._rooms 
      self._rooms = d.clear()
      

      d.clear() 将清除字典d(和self._rooms)并返回None。 因此,一切都说完了,d 是一个空字典,self._rooms 是None。

      最干净的解决方案是:

      self._rooms.clear()  #No need for assignment here!
      

      特别是因为self._rooms 似乎继承自dict - 所以它可能具有您不想丢失的其他属性:

      self._rooms={}  #Now this is just a dict, no longer has `set_guest` method!
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-08
        • 1970-01-01
        • 1970-01-01
        • 2019-12-09
        • 1970-01-01
        • 2016-03-29
        • 2018-09-19
        相关资源
        最近更新 更多