python - 在被调用函数和调用函数之间共享 Python 范围

标签 python scope

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/

相关文章:

python - 无法获取多个数据库的结果(SQL 工具)

python - 使用自定义 POS 标签进行 NLTK 分块?

python - 链接队列类

python - 为什么不用global关键字就不会报错

Windows批处理括号范围

c++ - 访问命名空间内的类中的枚举

Python 3 整数除法

python - 如何查看 Django View 的错误日志

ruby-on-rails - Rails I18n 翻译范围

java - 尝试在使用 if/else 的同时实现评分系统。 [JAVA]