2024-09-29 23:32:20 发布
网友
def main(): x=2 def cool(): y=4 nonlocal x print (x)
它显示了一个错误-,非局部的x是一个无效的语法-,如果我不声明它为非局部的,它表示未定义的x。那么,我如何访问其他函数中的变量呢?现在我如何访问在main()中定义的x变量。你知道吗
你不能
你不应该这样做。这样做只会让你很难读取代码,因为任何地方的代码都可以读取和修改你的变量。通过将访问限制在一个函数中,可以更容易地执行。你知道吗
你没有。函数的局部变量只在该函数运行时存在;因此一旦main返回,它的x就不存在了。这还与这样一个事实有关:对函数的单独调用会得到一个单独的变量。你知道吗
您所描述的有点像在C中读取静态变量的值。与静态变量的区别在于它们独立于调用;它们仍然存在,这使得大多数使用它们的函数不可重入。有时adding a default argument with a mutable value会在Python中模拟这种情况,但也有同样的缺点。你知道吗
在CPython中,您实际上可以通过检查纯Python函数的代码对象来找出它的局部变量是什么,但是它们的值只存在于调用本身中,通常在调用堆栈中。你知道吗
def func(): x=2 import dis print func.__code__.co_varnames dis.disassemble(func.__code__)
收益率:
('x',) 2 0 LOAD_CONST 1 (2) 3 STORE_FAST 0 (x) 6 LOAD_CONST 0 (None) 9 RETURN_VALUE
所以x实际上是局部变量0。你知道吗
我建议在调试器中查找有关调用堆栈检查的详细信息。你知道吗
一旦你开始需要函数的属性,就把它变成一个functor:
class MainFactory(object): def __call__(self): self.x = 4 main = MainFactory() # Create the function-like object main main() # call it print main.x # inspect internal attributes
python中的函子只是一个普通对象,其类实现了特殊的__call__方法。它还可以有一个__init__方法,在这个方法中,您可以根据需要预先设置属性的值。然后,通过在实例化时提供不同的参数,可以创建不同的functor“风格”:
__call__
__init__
class MainFactory(object): def __init__(self, parameter=1): self.parameter = parameter def __call__(self): self.x = 4 * self.parameter
现在main = MainFactory(2); main()将main.x设置为8。你知道吗
main = MainFactory(2); main()
main.x
显然,您可以通过简单地使用局部变量而不是self的属性来保持函数中不重要的变量不可访问:
self
def __call__(self): # i and p are not accessible from outside, self.x is for i in range(10): p = i ** self.parameter self.x += p
你不能
你不应该这样做。这样做只会让你很难读取代码,因为任何地方的代码都可以读取和修改你的变量。通过将访问限制在一个函数中,可以更容易地执行。你知道吗
你没有。函数的局部变量只在该函数运行时存在;因此一旦main返回,它的x就不存在了。这还与这样一个事实有关:对函数的单独调用会得到一个单独的变量。你知道吗
您所描述的有点像在C中读取静态变量的值。与静态变量的区别在于它们独立于调用;它们仍然存在,这使得大多数使用它们的函数不可重入。有时adding a default argument with a mutable value会在Python中模拟这种情况,但也有同样的缺点。你知道吗
在CPython中,您实际上可以通过检查纯Python函数的代码对象来找出它的局部变量是什么,但是它们的值只存在于调用本身中,通常在调用堆栈中。你知道吗
收益率:
所以x实际上是局部变量0。你知道吗
我建议在调试器中查找有关调用堆栈检查的详细信息。你知道吗
一旦你开始需要函数的属性,就把它变成一个functor:
python中的函子只是一个普通对象,其类实现了特殊的
__call__
方法。它还可以有一个__init__
方法,在这个方法中,您可以根据需要预先设置属性的值。然后,通过在实例化时提供不同的参数,可以创建不同的functor“风格”:现在
main = MainFactory(2); main()
将main.x
设置为8。你知道吗显然,您可以通过简单地使用局部变量而不是
self
的属性来保持函数中不重要的变量不可访问:相关问题 更多 >
编程相关推荐