SyntaxError:没有找到非本地“i”的绑定

Posted

技术标签:

【中文标题】SyntaxError:没有找到非本地“i”的绑定【英文标题】:SyntaxError: no binding for nonlocal 'i' found 【发布时间】:2021-09-28 22:52:58 【问题描述】:

我想定义一个静态变量 i(通过对该函数的所有递归调用,我只想要一个 i 的副本)。为此,我在类下方但在函数之外声明了“i”。要使用声明的“i”,我在函数定义中使用了关键字“nonlocal i”。(请参阅下面的代码)即使这样,我也会收到错误

SyntaxError: no binding for nonlocal 'i' found
    ^
    nonlocal i
Line 9  (Solution.py)

参考下面的代码,我正在尝试解决一个leetcode问题

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    i = 0
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        nonlocal i
        if(head is None or head.next is None):
            i+=1
            return head
        else:
            p = self.removeNthFromEnd(head.next,n)
            if(i>n):
                i=i+1
                return head
            if(i  == n):
                head.next = p.next
                p.next = None
                i=i+1
                return head
            else:
                i = i+1
                return head
                

【问题讨论】:

i 定义为实例属性并引用为self.i 可能会更容易。 nonlocal 只为嵌套函数定义,而不是类属性。 您可能还想将标签更改为 python 以吸引更广泛的受众。 【参考方案1】:

在类中的函数外部定义i 意味着它的引用是self.i,而不是i。改用类方法:

class Solution:
    i = 0
    
    @classmethod
    def removeNthFromEnd(cls):
        cls.i += 1
        return cls.i

sol = Solution()
sol.removeNthFromEnd()
sol.removeNthFromEnd()

sol_two = Solution()
sol_two.removeNthFromEnd()

>> 3

【讨论】:

以上是关于SyntaxError:没有找到非本地“i”的绑定的主要内容,如果未能解决你的问题,请参考以下文章

特定功能的非本地绑定

如何使用具有多个内部函数的非本地语句?

如何在python中访问类定义中的非本地范围?

SyntaxError: 非 ASCII 字符 '\xd1'

Python:如何解决SyntaxError:非ASCII字符?

运行 Python 代码中的“SyntaxError:非 ASCII 字符”