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()