Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何访问在其他函数中声明的变量?_Python - Fatal编程技术网

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

Python 如何访问在其他函数中声明的变量?,python,Python,它显示了一个错误--nonlocal x是一个无效的语法--。如果我不将它声明为nonlocal,它会显示undefined x。那么,如何访问其他函数中的变量?现在如何访问main()中定义的x变量。一旦开始需要函数的属性,请将其转换为: python中的函子只是一个普通对象,其类实现了特殊的\uu调用\uu方法。它还可以有一个\uuuuu init\uuuu方法,如果您愿意,您可以在其中预先设置属性值。然后,通过在实例化时提供不同的参数,可以创建不同的函子“风格”: class MainFa

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

一旦开始需要函数的属性,请将其转换为:

python中的函子只是一个普通对象,其类实现了特殊的
\uu调用\uu
方法。它还可以有一个
\uuuuu init\uuuu
方法,如果您愿意,您可以在其中预先设置属性值。然后,通过在实例化时提供不同的参数,可以创建不同的函子“风格”:

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
现在
main=MainFactory(2);main()
main.x
设置为8

显然,只需使用局部变量而不是
self
的属性,就可以使函数中不重要的变量不可访问:

class MainFactory(object):
    def __init__(self, parameter=1):
        self.parameter = parameter

    def __call__(self):
        self.x = 4 * self.parameter

一旦开始需要函数的属性,请将其转换为:

python中的函子只是一个普通对象,其类实现了特殊的
\uu调用\uu
方法。它还可以有一个
\uuuuu init\uuuu
方法,如果您愿意,您可以在其中预先设置属性值。然后,通过在实例化时提供不同的参数,可以创建不同的函子“风格”:

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
现在
main=MainFactory(2);main()
main.x
设置为8

显然,只需使用局部变量而不是
self
的属性,就可以使函数中不重要的变量不可访问:

class MainFactory(object):
    def __init__(self, parameter=1):
        self.parameter = parameter

    def __call__(self):
        self.x = 4 * self.parameter
你不能

你不应该。这样做只会使读取代码变得困难,因为来自任何地方的代码都可以读取和修改您的变量。通过将访问限制在一个功能上,可以更容易地执行。

您不能


你不应该。这样做只会使读取代码变得困难,因为来自任何地方的代码都可以读取和修改您的变量。通过将访问限制在一个功能上,可以更容易地执行。

您不需要。函数的局部变量仅在该函数运行时存在;所以一旦main返回,它的x就不存在了。这也与单独调用函数会得到单独变量的事实有关

您所描述的有点像在C中读取静态变量的值。与静态变量的区别在于它们独立于调用;它们仍然存在,这使得大多数使用它们的函数不可重入。有时,Python会模仿这一点,但也有同样的缺点

在CPython中,您实际上可以通过检查纯Python函数的代码对象来找出它的局部变量,但是它们的值只存在于调用本身中,通常在调用堆栈中

   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
收益率:

def func():
     x=2
import dis
print func.__code__.co_varnames
dis.disassemble(func.__code__)
所以x实际上是局部变量0


我建议查询调试器以了解有关调用堆栈检查的详细信息。

您不需要。函数的局部变量仅在该函数运行时存在;所以一旦main返回,它的x就不存在了。这也与单独调用函数会得到单独变量的事实有关

您所描述的有点像在C中读取静态变量的值。与静态变量的区别在于它们独立于调用;它们仍然存在,这使得大多数使用它们的函数不可重入。有时,Python会模仿这一点,但也有同样的缺点

在CPython中,您实际上可以通过检查纯Python函数的代码对象来找出它的局部变量,但是它们的值只存在于调用本身中,通常在调用堆栈中

   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
收益率:

def func():
     x=2
import dis
print func.__code__.co_varnames
dis.disassemble(func.__code__)
所以x实际上是局部变量0


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

这并不能完全回答niko的问题,是吗?您已将
x
更改为全局变量。这并不能完全回答niko的问题,是吗?您已将
x
更改为全局变量。非局部是python 3的新特性,用于从外部范围(非全局)访问变量。好的,如果它是python 2.5.5,我该如何访问它?非本地不是您所认为的。为什么你需要访问变量,而不仅仅是返回值?这不是任何项目,我是一个初学者,我正在体验它。我正在学习全球概念,因此,在教程中,他在main之外定义了一个变量,并使用global在函数中访问它,但我想让它反向运行,但它不起作用。我想在函数中定义它并在外部访问它)nonlocal是python 3的新功能,它用于从外部范围(非全局)访问变量。好的,如果它是python 2.5.5,我该如何访问它?非本地不是您所认为的。为什么你需要访问变量,而不仅仅是返回值?这不是任何项目,我是一个初学者,我正在体验它。我正在学习全球概念,因此,在教程中,他在main之外定义了一个变量,并使用global在函数中访问它,但我想让它反向运行,但它不起作用。我想在函数中定义它并在外部访问它)虽然这是一种有趣的技术,但你已经错过了OP的实际问题,这是初学者对Python作用域性质的误解。@Ned我完全理解OP的问题。已经提出的评论解释说,不可能按照他想要的方式来做,我认为没有必要重复。我的答案是唯一一个说明了如何完全按照OP的要求去做的答案,尽管不是以他尝试的方式:调用一个没有参数的函数,然后访问函数内部使用的变量,而不使用全局变量。我认为否决票是不必要的。虽然这是一种有趣的技术,但您已经错过了OP的实际问题,这是一个初学者对Python作用域性质的误解。@Ne