python中的作用域

作用域

先谈谈python中的全局变量和局部变量

一,全局量和局部变量

全局变量,所有的作用域都可读。而在定义的def函数内部的变量则属于局部变量,只
对该函数生效,如果想在自定义的函数中修改全局变量,需要:global name ,然后再定义
即可对全局变量重新赋值。但是对于像列表、字典、嵌套有列表的元组这样的全局变量,
在不使用global的情况下,自定义的函数中全局变量可修改但是不可重新赋值(意思是重
新赋值只会在当前函数中生效,而修改则会在接下来所有的函数中生效,相当于修改了全
局变量)。

1,一定注意在定义全局变量的时候,一定要大写。如,NAME = 'tom'等。

NAME = 'tom'
def f1():
	age = 19
	global NAME
	NAME = 'yn'
	print(NAME, age)

def f2():
	age = 18
	print(NAME,age)
f1()
f2()

执行结果:

yn, 19

yn, 18

2, 

NAME = [ 'tom','lucy']
def f1():
	age = 19
#    global NAME
	NAME.append('yn')  #修改会在接下来的函数中也生效,成为全局变量
	print(NAME, age)

def f2():
	age = 18
	print(NAME,age)  
f1()
f2()

执行结果:

['tom', 'lucy', 'yn'] 19
['tom', 'lucy', 'yn'] 18

二, 块级作用域

python javascripts中无块级作用域(块级作用域是指if...else...中)

java C#中有块级作用域

1, 所以下面这段代码在python和javascripts中有执行结果,在java和C#中则没有

if	1 == 1:
	name = "tom"
	
print(name)

  

2, python作用域链,由内向外找,直到找不到报错!

name = "tom"

def f1():
	name = "a"
	def f2():
		name = 'b'
		print(name)
	f2()

f1()

执行结果:

b

3, 易混淆的点

name = "tom"

def f1():
	print(name)
	
def f2():
	name = 'lucy'
	f1()

f2()

执行结果:

tom

4,易混淆的点

name = "tom"

def f1():
	print(name)

def f2():
	name = "lucy"
	return f1

ret = f2()
ret()

执行结果:

tom

总结:

python中,在函数未执行之前,作用域已经确定了,作用域链也已经确定了。
作用域跟函数放在哪执行没有关系,无论在哪执行函数都要去原函数所在的作用域由内向外去找。

原文地址:https://www.cnblogs.com/yang-ning/p/6400661.html