如何访问在其他函数中声明的变量?

2024-09-29 23:32:20 发布

您现在位置:Python中文网/ 问答频道 /正文

      def main():
                 x=2
      def cool():
                 y=4

nonlocal x
print (x)

它显示了一个错误-,非局部的x是一个无效的语法-,如果我不声明它为非局部的,它表示未定义的x。那么,我如何访问其他函数中的变量呢?现在我如何访问在main()中定义的x变量。你知道吗


Tags: 函数声明定义maindef错误语法局部
3条回答

你不能

你不应该这样做。这样做只会让你很难读取代码,因为任何地方的代码都可以读取和修改你的变量。通过将访问限制在一个函数中,可以更容易地执行。你知道吗

你没有。函数的局部变量只在该函数运行时存在;因此一旦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“风格”:

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。你知道吗

显然,您可以通过简单地使用局部变量而不是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

相关问题 更多 >

    热门问题