假设我有一个可变持续时间的函数。
在没有调整任何参数的情况下,有没有办法在其他一些非父函数中将函数设置在函数外部?
答案 0 :(得分:2)
使用Python 3.x,您可以使用nonlocal
关键字
def make_slow(action):
slowDuration = None
def slowAction(self, colony):
nonlocal slowDuration
slowDuration = 10 # It is changing the variable from the scope above
如果您想要从其他地方更改某个值并且您不能返回该值,请尝试执行global
...请注意,这可能会污染您当前的命名空间。
对于更加pythonic的方法,你应该使用像self.slowDuration
这样的东西。那是什么对象。
答案 1 :(得分:1)
slowDuration
是slowAction
函数的局部变量。局部变量的要点是它们只能在函数内部访问。
您应该更改slowAction
函数,以便它使用在其他位置定义的slowDuration
变量,例如作为make_slow
显然属于的类的成员变量。
您还可以使slowAction
成为覆盖__call__
方法的类的实例。
>>> class Counter:
... def __init__(self):
... self.count = 0
... def __call__(self, delta):
... self.count += delta
... print(self.count)
... def set_count(self, c):
... self.count = c
...
>>> c = Counter()
>>> c(1)
1
>>> c(3)
4
>>> c(3)
7
>>> c(3)
10
>>> c.set_count(42)
>>> c(-2)
40
您还可以使用一些技巧来使共享变量在函数对象本身上可用:
def makeCounter():
counter = None
def counter_func():
counter.count += 1
print(counter.count)
counter = counter_func
counter.count = 0
return counter
并像这样使用它:
>>> c = makeCounter()
>>> c()
1
>>> c()
2
>>> c()
3
>>> c()
4
>>> c.count = 42
>>> c()
43
>>> c()
44
>>> c()
45
但总的来说,"聪明"应该避免这样的代码,除非你有充分的理由使用它,因为它使代码库更难理解。