Discuss / Python / UnboundLocalError

UnboundLocalError

Topic source

拿笔小星

#1 Created at ... [Delete] [Delete and Lock User]
def createCounter():
    i = 0
    def counter():
        i = 1 + i
        return i
    return counter

报错:

UnboundLocalError: local variable 'i' referenced before assignment

这是因为,当你在当前作用域中的给变量赋值时,该变量将成为该作用域的局部变量,并在外部范围中隐藏任何类似命名的变量

所以在执行i = 1 + i的时候。因为i被重新赋值了,所以i的作用域编程counter函数范围。同时将它原来在createCounter函数范围的同名变量i消除。然后,执行1 + i的时候就出错了,此时i还没有定义呢!所以报错:UnboundLocalError: local variable 'i' referenced before assignment

参考

JTL深渊

#2 Created at ... [Delete] [Delete and Lock User]

声明i为全局变量即可

拿笔小星

#3 Created at ... [Delete] [Delete and Lock User]

最好不要滥用全局变量!!!能局部就局部。

函数访问外层函数的局部变量时, 要用nonlocal。

ZR1026q

#5 Created at ... [Delete] [Delete and Lock User]

666,刚有此疑惑

支离疏丨

#6 Created at ... [Delete] [Delete and Lock User]
def createCounter():    L = [0]    def counter():        L[0] = L[0] + 1        return L[0]    return counter

这个函数里 L=[0]

为什么不是一个局部变量,counter()函数仍能调用呢?

bobo菠萝妹

#7 Created at ... [Delete] [Delete and Lock User]

L的作用范围是createCounter,在counter里当然能调用,

只要不在counter里重新给L赋值,那么counter中使用的L就是外部的L,否则就是内部的新变量L。

郭大侠14

#8 Created at ... [Delete] [Delete and Lock User]

为什么呢?

 L[0] = L[0] + 1  

不也重新赋值了吗

你看如果我这样写也没有报错:

def createCounter():    l=[0]    def counter():        l=[1]        return l    return counter

郭大侠14

#9 Created at ... [Delete] [Delete and Lock User]

哦 我查了一下 python中list 是全局变量

壮士别跑

#10 Created at ... [Delete] [Delete and Lock User]

Ls,跟全局变量没啥关系,你如果更改变量L的指向,照样会报错误,这个L[0]=L[0]+i并没有改变L这个变量指向那个list,依然指向那个list,只是list里边的[0]变了而已


  • 1

Reply