我定义了一个函数,其中有一个变量num赋值为 1000,increment变量用于将 num 增加 1。当它第一次被调用时,它会增加一并显示值 1001,但是当它再次被调用时,它会显示相同的值 1001,但它应该在每次调用时显示 1002、1003
def number():
num = 1000
increment = num +1
return increment
print(number())
def incrementor():
info = {"count": 999}
def number():
info["count"] += 1
return info["count"]
return number
number = incrementor()
>>> number()
1000
>>> number()
1001
>>> number()
1002
(字典有点笨拙,但你不能用一个简单的变量名来做,至少不使用 Python 3 的nonlocal关键字,这对我来说更笨拙。我想这个特定的例子不会被认为是非常 Pythonic 的 -但这是一个选项,您将在其他 Python 代码中看到类似模式的真正用途。)
Python 允许将属性附加到函数(毕竟它是 class 的对象function)。
因此,您可以通过这种方式避免全局(或非局部)变量:
def number():
if hasattr(number, "num"):
number.num += 1 # increment if not first call
else:
number.num = 1000 # initialize on first call
return number.num
演示:
>>> for i in range(10):
print(number())
按预期显示:
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
并且没有与全局变量的另一种使用发生冲突的风险......
但要小心。一个晚上后,我意识到虽然这是你要求的,但这是一种反模式。这是 OOP 语言中的一个有状态函数,yerk ...
状态应该保存在对象中,函数应该是无状态的。你可以打破这个规则,但它可能会混淆该代码的未来读者(甚至你......)。所以请不要。
您应该num在number函数外部定义,并将其声明为函数内部的全局变量,以便您可以引用它并在递增后更新其值:
num = 1000
def number():
global num
num += 1
return num
print(number())
print(number())
print(number())
这输出:
1001
1002
1003
或者,您可以定义一个具有保存当前值的实例变量和一个递增它的方法的类:
这个最好,可以自定义起始值,而且调用完自动归零。number = Number(1000)需要写在for外,print(number.increment())写在for内
class Number:
def __init__(self, value):
self.value = value
def increment(self):
self.value += 1
return self.value
以便:
number = Number(1000)
print(number.increment())
print(number.increment())
print(number.increment())
也会输出:
1001
1002
1003
然而,这使得用法有些冗长。一个更简单的方法是创建value一个类变量并覆盖该类的__new__方法:
class number:
value = 1000
def __new__(cls):
cls.value += 1
return cls.value
以便:
print(number())
print(number())
print(number())
会输出:
1001
1002
1003