3 回答
TA贡献1773条经验 获得超3个赞
除了已经发布的优秀答案外,您还可以使用闭包来做到这一点:
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 代码中看到类似模式的真正用途。)
TA贡献1818条经验 获得超8个赞
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 ...
状态应该保存在对象中,函数应该是无状态的。你可以打破这个规则,但它可能会混淆该代码的未来读者(甚至你......)。所以请不要。
TA贡献1876条经验 获得超7个赞
您应该num在number函数外部定义,并将其声明为函数内部的全局变量,以便您可以引用它并在递增后更新其值:
num = 1000
def number():
global num
num += 1
return num
print(number())
print(number())
print(number())
这输出:
1001
1002
1003
或者,您可以定义一个具有保存当前值的实例变量和一个递增它的方法的类:
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
添加回答
举报