Python变量定义初始化条件及递归代码报错差异咨询
问题1:Python中变量必须被定义或初始化的条件是什么?
在Python里,变量需要被定义/初始化的核心逻辑其实很直白:只要你要读取(引用)某个变量,那它必须已经被绑定了具体的值。
具体可以拆解成这几个场景:
- 函数局部作用域:如果代码里存在某条路径,会走到引用变量的步骤,但这条路径里变量没被赋值,就会触发
UnboundLocalError。简单说就是,局部变量要确保在所有可能用到它的分支里,都有被赋值的机会。 - 全局作用域:直接引用未定义的全局变量会触发
NameError,所以全局变量一般都是先定义再使用。 - 函数修改全局变量:如果在函数里想修改全局变量,必须先用
global声明该变量,不然Python会把它当成局部变量,这时候如果没先赋值就修改,同样会报错。
问题2:为什么两段条件赋值代码的运行结果不同?
先看你遇到问题的树高计算代码:
def getHeight(self,root): #Write your code here if not root: return -1 if root.left: i = self.getHeight(root.left) + 1 if root.right: j = self.getHeight(root.right) + 1 return max(i, j)
这段代码触发UnboundLocalError的关键原因是:存在代码分支会导致i或j没有被赋值就被引用。举个例子,如果某个节点只有右子树、没有左子树,那root.left为假,i的赋值语句根本不会执行,到了return max(i,j)这一行时,i还没被绑定任何值,自然就报错了。
再看你测试的这段代码:
if True: i = 1 + 1
它能正常运行是因为这个if的条件是恒成立的,i的赋值语句一定会被执行。不管后续怎么引用i,它都已经有了具体的值,所以不会触发未绑定错误。
两者的核心差异一句话就能说清:
- 树高代码里的
if是可能不成立的,存在变量未赋值的分支; - 测试代码里的
if是必然成立的,变量一定会被赋值,不存在未绑定的情况。
你添加i, j = 0, 0之后,相当于给i和j设置了默认值,不管后续的if条件是否成立,变量都已经有了初始值,所以就能正常运行了。
内容的提问来源于stack exchange,提问作者yixuan
相关产品推荐
相关产品推荐

