1
A
回答
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
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
但总的来说,“聪明“的代码应该避免,除非你有很好的理由使用它,因为它使得代码库变得更难理解。
相关问题
- 1. 为所有实例变量设置Attr_accessor
- 2. 是否有可能使Python函数的行为像实例一样?
- 3. 是否有可能专门为变量设置内存限制?
- 4. 是否有可能在php中实例化一个函数?
- 5. 是否有可能在python中使用变量作为代码
- 6. 实例变量未设置在类的一个函数中
- 7. 是否有可能在构造函数中声明变量[Java]
- 8. copyWithZone设置实例变量?
- 9. GraphQL - 是否有可能设置一个变量结果为突变
- 10. 为什么不能将变量设置为等于Python中的函数调用?
- 11. 设置JavaScript函数里面的ruby实例变量
- 12. 是否有可能改变PHP的print_r函数的行为
- 13. 重新分配实例变量,是否更好先设置nil
- 14. 是否有可能将Rails变量传递给JavaScript函数?
- 15. 是否有可能在变量上调用jquery函数?
- 16. 在Ruby中设置实例变量
- 17. 回调函数中的实例变量
- 18. 是否有可能丢弃Vue实例中的数据错误?
- 19. python中是否有一个接受变量的随机函数?
- 20. Tcl:在类中设置自有实例的私有变量
- 21. 泛型函数的不同实例是否可能具有不同的静态变量?
- 22. 是否有可能在PHP中延迟变量实现(?)/承认(?)?
- 23. Python:为什么不能描述符是实例变量?
- 24. 是否有可能在变量中更改变量的值?
- 25. 是否有get()作为变量的实例?
- 26. 是否为没有实例变量的对象分配内存?
- 27. 在构造函数中设置ThreadLocal变量是否工作?
- 28. 是否有可能为xib文件中的UI控件(例如UIButton)设置UIAccessibilityFrame
- 29. 如何将NSUserDefault设置设置为实例变量?
- 30. onDestroy() - 设置或不设置实例变量为空?
从'slowAction'或'make_slow'外面? – cdonts
对不起,如果我不清楚。我想调整一个完全独立于我称之为函数的函数的值。 – swagbag
恐怕这是不可能的。为什么你不能使用参数? – cdonts