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