Python 我怎样才能避免这种情况;赋值前引用的变量";?
遇到以下问题。这可能是一个简单的解决方案,以前可能有人问过,但我找不到Python 我怎样才能避免这种情况;赋值前引用的变量";?,python,python-2.7,Python,Python 2.7,遇到以下问题。这可能是一个简单的解决方案,以前可能有人问过,但我找不到 def a(): liA = [] def b(): for i in liA: i += 1 liB = generateList() for i in liB: i -= 1 liA = liB def generateList(): return [1,2,3,4]
def a():
liA = []
def b():
for i in liA:
i += 1
liB = generateList()
for i in liB:
i -= 1
liA = liB
def generateList():
return [1,2,3,4]
b()
a()
UnboundLocalError:赋值前引用的局部变量“liA”
liA
函数中的变量b()
从未初始化
因此,您应该按照以下方式编辑代码:
def a():
liA = []
def b(liA):
for i in liA:
i += 1
liB = generateList()
for i in liB:
i -= 1
liA = liB
def generateList():
return [1,2,3,4]
b(liA)
a()
希望我能帮助你 如果查看整个堆栈跟踪,可以更好地了解错误是如何发生的
Traceback (most recent call last):
File "/Users/jwp/Desktop/junk.py3", line 16, in <module>
a()
File "/Users/jwp/Desktop/junk.py3", line 14, in a
b()
File "/Users/jwp/Desktop/junk.py3", line 4, in b
for i in liA:
UnboundLocalError: local variable 'liA' referenced before assignment
这是否满足您的需要?除非您将内部函数用作闭包,否则赋值
liA=liB
几乎没有用。“但我找不到它”-您没有想到要搜索错误消息?为什么要将此变量作为参数传递和隐藏?显然有一个liA
变量被赋予了一个值。只需删除liA=liB
就不需要传递任何东西,b
已经知道什么是liA
,但赋值使其成为局部变量。其次,赋值liA=liB
不会以任何方式影响传递的liA
。因为具有给定值的liA变量在b()函数中不可见。另一种解决方案可能是使用全局变量,因此在a()外部定义liA,并在使用它的每个函数内部定义它为全局。@vathek..但是外部liA
变量是可见的(去掉liA=liB
的赋值,原始代码不会抛出错误);当范围中有任务时,问题就出现了。但是为什么呢?liA是b()中的一个新局部变量,而不是原来的局部变量,其中var\u in\u a
仅在父(a
)范围内赋值?(或者我的问题应该是:'如何在包含范围内重新绑定变量'?)@user2864740 Read。如果没有为作用域内的变量赋值,则该变量不会在本地声明,因此名称查找将检查外部作用域中的名称。这就是为什么您可以从外部范围很好地读取变量,但当您开始为其赋值时,一切都会中断。然后,它成为一个新的变量。
def a():
liA = []
def b(inlist):
liA = inlist
for i in liA:
i += 1
liB = generateList()
for i in liB:
i -= 1
liA = liB
def generateList():
return [1,2,3,4]
b(liA)
a()