Python切片操作引发UnboundLocalError,pop()正常的原因咨询
问题原因分析
这个差异完全是Python的变量作用域规则导致的,核心区别在于两种操作对变量的处理方式不同:
1. curr.pop() 为什么能正常运行
pop() 是列表的内置方法,它的作用是直接修改当前列表对象(删除最后一个元素),并没有重新给curr变量赋值。此时Python会默认在外部作用域(也就是exist函数的作用域)查找curr变量,找到后直接操作这个列表对象,不会把curr当成dfs函数的局部变量。
2. curr = curr[:-1] 为什么触发错误
curr[:-1] 是创建一个原列表的切片(去掉最后一个元素的新列表),然后执行curr = ...是给curr变量重新赋值,让它指向这个新创建的列表。
Python的规则是:如果函数内部有对变量的赋值语句,就会把这个变量标记为当前函数的局部变量。所以当dfs函数执行到开头的if (len(curr) >= len(word)):时,Python会认为curr是dfs的局部变量,但此时这个局部变量还没有被赋值(赋值语句在后面),因此触发UnboundLocalError。
解决方案
如果非要用切片的方式实现,只需要在dfs函数开头加上nonlocal curr声明,告诉Python这个变量来自外部函数的作用域,而不是局部变量:
def dfs(i, j): nonlocal curr # 添加这一行 if (i, j) in visited: return False # 后续代码不变
或者继续使用curr.pop(),因为它本身就是修改原列表对象,不需要额外声明。
内容的提问来源于stack exchange,提问作者Prateek Bhuwania
相关产品推荐
相关产品推荐

