【问题标题】:Unresolved reference in a python local functionpython本地函数中未解析的引用
【发布时间】:2018-07-16 10:17:42
【问题描述】:

通常在本地函数中,我应该能够访问在封闭范围内声明的任何变量。但我收到未解决的参考错误。这是代码sn-p。

import time
def make_timer():
    last_called = None
    def elapsed():
        now = time.time()
        print(last_called)
        # nonlocal last_called
        if last_called is None:
            last_called = now
        return None
        elapsed_time = now - last_called
        last_called = now
        return elapsed_time
    return elapsed

访问 last_call 会产生未解决的引用错误。

【问题讨论】:

    标签: python-3.x scope namespaces


    【解决方案1】:
    last_called = None
    

    名为last_called 的对象是不可变的。要更改内容 object 将释放该对象并分配一个新对象。

    print(last_called)
    

    看起来像调试代码。 last_called 被视为不可变对象 尚未声明为非本地名称。

    # nonlocal last_called
    

    即使你取消注释这行,它也是在lasted_call的访问之后 通过使用以前的print。更改范围为时已晚。

    last_called = now
    

    这是任务。 print(last_called) 在 a 中引用 None 不同的范围和对象是不可变的,现在尝试为其分配一个值。

    elapsed 函数想要访问名为 last_called 的不可变对象。 口译员继续作业,无法继续。 引发异常。

    last_calledelapsed 中的行为的可能选项:

    1. 如果使用nonlocal last_called,则在访问和赋值之前声明。

    2. 如果未声明nonlocal last_called,则在赋值之前访问会导致 一个例外。

    3. 如果未声明nonlocal last_called,则赋值后访问使用 本地名称last_called

    您的代码顺序可能会更好:

    import time
    def make_timer():
        last_called = None
        def elapsed():
            now = time.time()
            nonlocal last_called             # declare scope
            print(last_called)               # access
            if last_called is None:          # access
                last_called = now            # assign
            return None
            elapsed_time = now - last_called # access
            last_called = now                # assign
            return elapsed_time
        return elapsed
    

    nonlocal last_called 未注释,因为它是选项 1 所必需的。

    【讨论】:

      【解决方案2】:

      由于在 elapsed 函数内对 last_called 的分配而出现错误。未声明为 globalnonlocal 并在函数内部分配值的变量是局部变量。在您访问该变量时,它尚未被分配一个值,这会导致错误。

      import time
      def make_timer():
          last_called = None
          def elapsed():
              now = time.time()
              print(last_called)
              if last_called is None:
                  last_called = now # <- 
                  return None
              elapsed_time = now - last_called
              last_called = now # <- 
              return elapsed_time
          return elapsed
      

      更多信息可以在这里找到: Why can functions in Python print variables in enclosing scope but cannot use them in assignment?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-28
        • 2019-02-09
        • 2017-09-18
        • 2021-06-17
        相关资源
        最近更新 更多