我定义了一个函数,其中有一个变量num
分配了1000,而increment
变量用于将num递增1。首次调用时,它会增加一个并显示值1001,但是再次调用时,它会显示相同的值1001,但每次调用时都应显示1002、1003
def number():
num = 1000
increment = num +1
return increment
print(number())
答案 0 :(得分:2)
Python允许将属性附加到函数(毕竟它是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 ...
状态应该保存在对象中,而功能应该是无状态的。您可以违反此规则,但可能会使以后的代码读者(甚至您)感到困惑。所以请不要。
答案 1 :(得分:1)
您应该在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
答案 2 :(得分:0)
除了已经发布的出色答案之外,您还可以使用闭包来实现:
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代码中看到类似模式的真正用途。)
答案 3 :(得分:0)
sum
这将使字典变异。
或者
def increment(state):
state['value'] += 1
return state['value']
state = {'value': 1000}
print(increment(state))
答案 4 :(得分:0)