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
的开头使用linenonlocal total