无法在 __init__ 函数 Python 中递增全局变量

Cannot increment a global variable in the __init__ function Python

我试图在 __init__ 中增加一个名为“lastIdentify”的全局变量,但我做不到。

class Agent:

   lastIdentify = 0

   def __init__(self,name,tel,age,gender='ND'):
      global lastIdentify
      lastIdentify += 1
      self._identify = lastIdentify

我也试过删除全局语句,但没有任何反应。

我有这个错误: init 中的文件“/.../A/Agent.py”,第 10 行 最后识别 += 1 NameError:名称 'lastIdentify' 未定义

谢谢!

因此,正如 Barmar 所想,您心中有一个 class 变量。

这里棘手的部分是:Python 具有可变数据(列表、字典、集合...)和不可变数据(整数、浮点数、字符串...)。

当您修改 class 级别的不可变变量时,您将其复制并绑定到实例的 scope/namespace。这就是 badlastIdentify.

上发生的事情

另一方面,如果您开始改变 class 范围的可变属性,例如列表,您会发现您正在修改 class 级别的变量,即您的列表会变得越来越大,即使那不是你想要的。

并且,在您的原始代码中,global lastIdentify 又是一个东西:它以前不存在,无法递增,并且与您的 没有 关系class。一般来说,global 作为 Python 中的关键字有点代码味道,通常最好以不同的方式处理。而且,不,我不是一个对全局变量和单例变量都不好的人,特别是在使用 global 时。

class Agent:

   lastIdentify = 0
   badlastIdentify = 0

   def __init__(self,name,tel,age,gender='ND'):

      # you are operating on the class namespace, 
      #not on an instance-specific variable
      self.__class__.lastIdentify += 1

      #this doesnt "mutate" the class-variable
      #it binds a new copy of it, +1, to this instance
      self.badlastIdentify += 1

agent99 = Agent(1,2,3,4)
agent007 = Agent(1,2,3,4)

print(f"{agent99.badlastIdentify=} , {agent99.lastIdentify=} ")
print(f"{agent007.badlastIdentify=} , {agent007.lastIdentify=} " )
print(f"{Agent.badlastIdentify=}  {Agent.lastIdentify=} ")


输出:

agent99.badlastIdentify=1 , agent99.lastIdentify=2
agent007.badlastIdentify=1 , agent007.lastIdentify=2
Agent.badlastIdentify=0  Agent.lastIdentify=2

另见:

What are Python namespaces all about
"Least Astonishment" and the Mutable Default Argument