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

时间:2011-07-11 10:46:41

标签: python

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

nonlocal x
print (x)

它显示一个错误,因为--nonlocal x是一个无效的语法 - 。如果我不将它声明为非本地语,则表示未定义的x。那么,我如何访问其他函数中的变量?现在我如何访问在main()中定义的x变量。

4 个答案:

答案 0 :(得分:3)

你不能。

你不应该。这样做会使代码难以读取,因为来自任何地方的代码都可以读取和修改变量。通过将访问权限限制在一个函数中,可以更容易理解。

答案 1 :(得分:1)

开始在函数上开始需要属性后,将其转换为 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__方法,您可以根据需要预先设置属性值。然后,您可以通过在实例化时提供不同的参数来创建函子的不同“风格”:

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

答案 2 :(得分:1)

你没有。函数本地的变量仅在该函数运行时存在;所以一旦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.

我建议查找调试器以获取有关调用堆栈检查的详细信息。

答案 3 :(得分:0)

x = 0
def main():
    global x
    x = 2 # accesses global x

main()
print x  # prints 2