def main():
x=2
def cool():
y=4
nonlocal x
print (x)
它显示一个错误,因为--nonlocal x是一个无效的语法 - 。如果我不将它声明为非本地语,则表示未定义的x。那么,我如何访问其他函数中的变量?现在我如何访问在main()中定义的x变量。
答案 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