无法在 __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
我试图在 __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