Python 中有没有一种方法可以管理范围,以便调用函数中的变量在被调用函数中可见?我想要类似下面的东西
z = 1
def a():
z = z * 2
print z
def b():
z = z + 1
print z
a()
print z
b()
我想得到以下输出
2
4
2
这个问题的真正解决方案就是将 z 作为变量传递。我不想这样做。
我有一个庞大而复杂的代码库,其中包含各种专业水平的用户。他们目前接受的培训是传递一个变量,现在我必须添加另一个变量。我不相信他们会通过所有函数调用始终如一地传递第二个变量,所以我正在寻找一种维护接口(interface)的替代方法。这很有可能是不可能的。
最佳答案
我想这就是您要找的。如果您控制内部函数,并且您正在寻找的变量已经在调用链中某处的范围内,但您不希望您的用户必须在调用本身中包含该变量。您显然不需要 global
关键字,因为您不希望内部赋值影响外部作用域。
使用 inspect
模块可以访问调用上下文。 (但是,请注意,它有些脆弱。您应该只将 CPython 用于非线程。)
import inspect
def calling_scope_variable(name):
frame = inspect.stack()[1][0]
while name not in frame.f_locals:
frame = frame.f_back
if frame is None:
return None
return frame.f_locals[name]
z = 1
def a():
z = calling_scope_variable('z')
z = z * 2
print z
def b():
z = calling_scope_variable('z')
z = z + 1
print z
a()
print z
b()
这确实给出了正确答案:
2
4
2
关于python - 在被调用函数和调用函数之间共享 Python 范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14692071/