为什么此代码有效:
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)
为什么此代码有效:
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)
因为在第一个代码中,您创建了一个局部变量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
中的局部变量的作用域,因为这样你的代码会更容易理解。
您增加变量的范围越多,外部源使用它的机会就越大,不需要使用它。
如果您var = ...
在函数中有任何位置,则名称“var”将被视为整个函数的局部变量,无论该赋值发生在何处。这意味着var
您的函数中所有出现的 都将在本地范围内解决,因此右侧var = var
导致引用之前的赋值错误,因为var
尚未在函数的范围内初始化。
您可以在不声明全局的情况下读取全局。但是要编写一个全局变量,您需要将其声明为全局变量。
在您的第二段代码中,您在 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)
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 中。谢谢
每个功能块都是一个本地范围。如果要分配给全局变量,则需要明确地这样做:
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