10

为什么此代码有效:

var = 0

def func(num):
    print num
    var = 1
    if num != 0:
        func(num-1)

func(10)

但是这个给出了一个“赋值前引用的局部变量'var'”错误:

var = 0

def func(num):
    print num
    var = var
    if num != 0:
        func(num-1)

func(10)
4

6 回答 6

9

因为在第一个代码中,您创建了一个局部变量var并使用了它的值,而在第二个代码中,您使用的是局部变量var,但没有定义它。

所以,如果你想让你的第二个函数工作,你需要声明: -

global var

在使用之前的函数中var

def func(num):
    print num
    var = 1  <--  # You create a local variable
    if num != 0:
        func(num-1)

而在这段代码中:

def func(num):
    print num
    var = var <--- # You are using the local variable on RHS without defining it
    if num != 0:
        func(num-1)

更新: -

但是,根据@Tim 的评论,您不应该global在函数中使用变量。而是在使用它之前定义您的变量,以便在local scope. 一般来说,你应该尝试将limit你的变量的作用域local,甚至在local命名空间limit中的局部变量的作用域,因为这样你的代码会更容易理解。

您增加变量的范围越多,外部源使用它的机会就越大,不需要使用它。

于 2012-10-26T17:10:55.583 回答
6

如果您var = ...在函数中有任何位置,则名称“var”将被视为整个函数的局部变量,无论该赋值发生在何处。这意味着var您的函数中所有出现的 都将在本地范围内解决,因此右侧var = var导致引用之前的赋值错误,因为var尚未在函数的范围内初始化。

于 2012-10-26T17:11:21.497 回答
1

您可以在不声明全局的情况下读取全局。但是要编写一个全局变量,您需要将其声明为全局变量。

于 2012-10-26T17:36:26.017 回答
0

在您的第二段代码中,您在 RHS 中创建了一个局部变量,并且没有定义它,而是将其分配给var全局的 LHS 变量(在函数外部定义的变量被认为是显式全局变量)。

如果您的意图是在函数内部创建一个局部变量并将其分配给全局变量的值,则可以这样做:

var = 0

def func(num):
    print num
    func.var = var # func.var is referring the local
                   # variable var inside the function func
    if num != 0:
        func(num-1)

func(10)
于 2014-11-25T06:32:32.783 回答
-1
def runscan(self):
    p = os.popen('LD_PRELOAD=/usr/libv4l/v4l1compat.so zbarcam
                /dev/video0','r')

def input(self):
    self.entryc.insert(END, code)

这个怎么样?我想在下一个函数中使用本地“代码”将条形码的结果插入到我的 Tkinter entryBox 中。谢谢

于 2017-01-06T19:26:21.543 回答
-3

每个功能块都是一个本地范围。如果要分配给全局变量,则需要明确地这样做:

var = 0

def func(num):
    print num
    global var
    var = 1
    if num != 0:
        func(num-1)

print var # 0
func(2)
print var # 1
于 2012-10-26T17:11:06.230 回答