Python中局部和全局变量作用域的澄清

Python中局部和全局变量作用域的澄清,python,Python,对于函数范围外引用的局部和全局变量,我有点困惑。对于一个问题,我有这个代码,它可以工作: def leafSimilar(self, root1: TreeNode, root2: TreeNode) -> bool: l1 = [] l2 = [] def traverseLeaf(root: TreeNode, sequence: list): if not root: return elif not roo

对于函数范围外引用的局部和全局变量,我有点困惑。对于一个问题,我有这个代码,它可以工作:

def leafSimilar(self, root1: TreeNode, root2: TreeNode) -> bool:
    l1 = []
    l2 = []
        
    def traverseLeaf(root: TreeNode, sequence: list): 
        if not root: return 
        elif not root.left and not root.right: sequence.append(root.val)
        else: 
            traverseLeaf(root.left, sequence)
            traverseLeaf(root.right, sequence)
                
    traverseLeaf(root1, l1)
    traverseLeaf(root2, l2)
        
    return l1 == l2
您可以看到我引用了函数范围之外的列表对象。但是,如果我尝试这样做:

# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def convertBST(self, root: TreeNode) -> TreeNode:
        total = 0
               
        def rightOrderTraversal(node: TreeNode):
            if not node: return
            elif not node.left and not node.right: 
                total += node.val
                node.val = total
            else: 
                rightOrderTraversal(node.right)
                total += node.val
                node.val = total
                rightOrderTraversal(node.left)                
            
        rightOrderTraversal(root)
        return root
它不起作用,错误显示我在调用
rightOrderTraversal
时将total作为局部变量引用。Python为哪种类型的变量创建本地引用?从这些示例来看,Python引用的列表似乎不在函数范围内,而不是int


我还尝试将total全局化作为解决该问题的一种方法,但没有成功。

如果要使用对象实例中任何方法/子函数都可见的变量,请使用“self”引用对象实例,例如:

class Solution:
   
    def my_method(self, total):
        self.total = total
               
        def my_function(total):
            self.total += total

        my_function(total)

s = Solution()
s.my_method(1)
print(s.total)

如果要使用对对象实例中的任何方法/子函数可见的变量,请使用“self”来引用对象实例,例如:

class Solution:
   
    def my_method(self, total):
        self.total = total
               
        def my_function(total):
            self.total += total

        my_function(total)

s = Solution()
s.my_method(1)
print(s.total)

您正在
rightOrderTraversal
内部分配给
total
。除非声明为非本地,否则它是本地的。这里有没有合适的方法来使用
global
?我试过了,但是在第一个例子中,你没有使用全局范围,你只是在函数定义前后引用了一个局部变量,您没有在子函数中使用var。请在分配给
total
rightOrderTraversal
开头使用行
nonlocal total
。除非声明为非本地,否则它是本地的。这里有没有合适的方法来使用
global
?我试过了,但在第一个示例中无法使其工作。您没有使用全局范围,您只是在函数定义前后引用局部变量,您没有在子函数中使用var。请在
rightOrderTraversal
的开头使用line
nonlocal total