【问题标题】:Python How to get caller scropePython如何获取调用者范围
【发布时间】:2016-01-05 13:24:30
【问题描述】:
def call(arg):
    return a+arg

def caller():
    a=1         
    call(2)

caller()

它返回:未定义全局名称'a'

【问题讨论】:

  • 你没有问一个明确的问题。这就是 Python 的工作方式。
  • 我需要从调用函数访问调用者作用域
  • python 不是这样工作的。
  • a 作为参数传递给调用,例如def call(arg, second_arg).
  • 拥有函数的全部意义在于不能混淆调用者的上下文。

标签: python scope


【解决方案1】:

您需要在方法定义之外定义a。在上面的代码中,变量 a 是方法 caller 的本地变量,通过在方法定义之外定义它,您将赋予它全局范围。

您遇到的错误是因为 python 正在寻找具有全局范围的东西,因此它说全局名称“a”未定义。

下面的代码在 python fiddle 中工作。

def call(arg):
    return a+arg

def caller():
    print call(2)

a=1        

caller()

【讨论】:

    【解决方案2】:

    变量a 在函数caller 中定义。因此,在caller 函数中访问a 可以正常工作。在函数call 中,变量a 没有定义,因此Python 会引发异常。

    您可以通过以下两种方法之一解决此问题:

    1. call 函数中将aarg 一起作为参数传递(首选)或
    2. a 定义为全局变量。 (不推荐)因为全局变量被认为是一种不好的做法。

    尝试重新定义函数call functionlike

    def call(a, arg):
        return a + arg
    

    【讨论】:

      【解决方案3】:

      这是一个不好的例子。它看起来更像:

      def cycle():
           for item in {'a':1,'b':2,'c':3}:
                do('a')
      
      def do(arg):
          if item.get(arg):
              pass
      

      而且我不能使用类,因为我使用的框架不支持继承。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-08
        • 1970-01-01
        • 2019-11-11
        • 2017-01-22
        • 2022-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多