为什么此代码有效:
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)
答案 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