记录博客 ZH-BLOG

python 局部和全局作用域

时间:2018-07-16 16:19:57分类:python 基础

  在函数内赋值的变量,处于该函数的“局部作用域”。在所有函数之外赋值的变量,属于“全局作用域”。处于局部作用域的变量,被称为“局部变量”。处于全局作用域的变量,被称为“全局变量”。一个变量必是其中一种,不能既是局部的又是全局的。

可以将“作用域” 看成是变量的容器。当作用域被销毁时,所有保存在该作用域内的变量的值就被丢弃了。只有一个全局作用域, 它是在程序开始时创建的。如果程序终止, 全局作用域就被销毁,它的所有变量就被丢弃了。

一个函数被调用时, 就创建了一个局部作用域。在这个函数内赋值的所有变量,存在于该局部作用域内。该函数返回时,这个局部作用域就被销毁了, 这些变量就丢失了。

  结论:全局作用域中的代码不能使用任何局部变量;但是,局部作用域可以访问全局变量;一个函数的局部作用域中的代码,不能使用其他局部作用域中的变量;在不同的作用域中,你可以用相同的名字命名不同的变量。也就是说,可以有一个名为 color 

的局部变量,和一个名为 color 的全局变量。

def cred():
	color='red'
	print(color)
	cn()

def cgreen():
	color='green'
	print(color)
	cred()
	print(color)

def cn():
	print(color)

color='blue'
cgreen()
print(color)
	
green
red
blue
green
blue

当函数想要改变全局变量时,需要使用 global。

def setRed():
	global color
	color='red'

def setGreen():
	global color
	color='green'
		
color='blue'
print(color)
setRed()
print(color)
setGreen()
print(color)
	
blue
red
green

区分一个变量是处于局部作用域还是全局作用域:

1.如果变量在全局作用域中使用(即在所有函数之外),它就总是全局变量。

2.如果在一个函数中,有针对该变量的 global 语句,它就是全局变量。

3.如果该变量用于函数中的赋值语句,它就是局部变量。

4.如果该变量没有用在赋值语句中,它就是全局变量。

def setRed():
	global color
	color='red'

def setGreen():
	global color
	color='green'

def cn():
	print(color)
		
color='blue'
cn()
setRed()
cn()
setGreen()
cn()
	
blue
red
green

在一个函数中, 一个变量要么总是全局变量, 要么总是局部变量。函数中的代码没有办法先使用名为 color 的局部变量, 稍后又在同一个函数中使用全局 color 变量。如果想在一个函数中修改全局变量中存储的值,就必须对该变量使用 global 语句。

在一个函数中, 如果试图在局部变量赋值之前就使用它,Python 看到 setGreen 函数中有针对 color 的赋值语句,因此认为 color 变量是局部变量。但是因为 print(color)的执行在 color 赋值之前,局部变量 color 并不存在。 Python 不会退回到使用

全局 color 变量。

def setRed():
	print(color)  ## name 'color' is used prior to global declaration
	global color
	color='red'

color='blue'
setRed()
	
def setGreen():
	print(color)  ## UnboundLocalError: local variable 'color' referenced before assignment
	color='green'

color='blue'
setGreen()