Python全局/局部变量

时间:2012-10-26 17:08:49

标签: python global-variables local-variables

为什么此代码有效:

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)

6 个答案:

答案 0 :(得分: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范围内的局部变量,因为这样您的代码将是更容易理解。

您增加变量范围的次数越多,外部源使用它的可能性就越大,不需要使用它。

答案 1 :(得分:6)

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

答案 2 :(得分:0)

您可以在不声明全局的情况下阅读全局。但要编写全局,您需要将其声明为全局。

答案 3 :(得分:0)

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

如果您打算在函数内部创建一个局部变量并将其赋值给全局变量的值,那么这将起到作用:

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)

答案 4 :(得分:0)

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中。 感谢

答案 5 :(得分:-2)

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

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