【问题标题】:Local Variable referenced before assignment inside of a class在类内部赋值之前引用的局部变量
【发布时间】:2013-10-20 18:20:21
【问题描述】:

情况是这样的

class Person(object):
    NumRid = 1
    def __init__(self, name, rid = NumRid):
        self.name = name
        self.rid = rid
        NumRid += 1

class Investor(Person):
    pass

然后我进入交互式 python 会话,并输入from file import * 然后 投资者('鲍勃') 它告诉我在赋值之前引用了局部变量 NumRid,在 NumRid += 1

据我从谷歌搜索得知,NumRid 应该在类的本地命名空间中,并且可以从类函数中访问......那么这是怎么回事?我需要声明两者都是全球性的吗?或者我可以输入一个神奇的词来让它在类命名空间中查找 NumRid(如果有的话)?

【问题讨论】:

  • UnboundLocal 问题在这里每周被问两次,使用搜索和按分数排序应该会引导您进行一些详细的解释(简而言之:您不能分配给周围定义的变量范围,至少不是这样)。不过还有一件事; rid = NumRid 不会做你想让它做的事情,因为默认参数是在编译时评估的,因此rid 将始终为 0。只需直接引用类变量并删除冗余参数...
  • 好吧,我想在每次创建新投资者时增加 rid,并将其指定为默认值,同时还可以选择传入不同的值:我检查了行为,看起来将它们全部初始化为 1,据我了解,这就是您所说的 0
  • 是的,你是对的,我之前评论中的 0 应该是 1。如果您希望能够传入不同的值,请使用哨兵值作为默认值 - 通常您会选择 None,除非这是一个有效值。然后在方法内部测试参数是否为哨兵,如果是则取当前的NumRid,否则取参数值。

标签: python object python-2.7 scope


【解决方案1】:

__init__ 函数内部,没有NumRid,但您正在尝试增加它。

如果它是一个实例变量,它应该是self.NumRid += 1,或者如果它是一个类变量,它应该是Person.NumRid += 1(或者,为了避免重命名类:self.__class__.NumRid += 1)。

【讨论】:

    【解决方案2】:

    当您在__init__ 中时,您的范围是那个函数,而不是类。所以NumRid 没有在那个范围内定义。您应该使用它的全名 Person.NumRid 来增加它。

    【讨论】:

      猜你喜欢
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      • 2021-07-27
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-04
      相关资源
      最近更新 更多