Python名称空间与作用域

时间:2020-08-03 19:55:33   收藏:0   阅读:83

名称空间:

内置名称空间:

全局命名空间:

临时名称空间:

加载到内存的顺序:

取值顺序:(就近原则:LEGB原则)单向不可逆

input = 333
print(input) # 此时是从全局开始取值,input()函数则不会被查找到
# 333

LEGB原则:

def func():
    print(x)

x = 111
func()		# 局部没有则在全局查找,在函数执行前x被赋值,所以并不会报错
# 111


x = 1
def func():
    print(x)
    
def foo():
    x = 222
    func()

foo()		# 名称空间的‘嵌套‘关系是以函数定义阶段为准,与调用位置无关
#  1		


input = 111
def f1():
    def f2():
        input = 333
        print(input)
    input = 222
    f2()
f1()			# 名称空间的‘嵌套‘关系是以函数定义阶段为准,与调用位置无关
#  333 

注:名称空间实际上是相互独立的一个个空间,并没有包含关系,嵌套关系仅为了帮助理解

作用域:

全局作用域:

局部作用域:

count = 1
def func():
	count = 100  # 这是在局部名称空间重新创建变量count,并非修改了全局名称空间的count
	print(count)
func()
# 100

count = 1
def func():
    count += 1		# 不可更改
    print(count)
func()
#  local variable ‘count‘ referenced before assignment

高阶函数:

作用域相关的内置函数:

print(globals())
print(globals())

函数中变量引用的坑:

count = 1
def func():
    print(count)     
    count = 2
func() 
#  local variable ‘count‘ referenced before assignment

关键字:

?

name = ‘杜甫‘
def func():
    global name    	 # 变量赋值前先声明name是全局名称,不要再造新名称
    name = ‘李白‘		
func()             	 # 函数调用后,函数内声明的全局变量才生效
print(name)
#  李白

?

l1 = [111,222]
def func():
    l1.append(333)

func()
print(l1)
# [111, 222, 333]
x = 0
def f1():
    x = 11		# 如果f1内的x注释掉,nonlocal则报错
    def f2():
        nonlocal x
        x = 22
    f2()
    print(‘f1内的x:‘,x)
f1()
# f1内的x: 22


x = 0
def f1():
    x = [11,]		
    def f2():
        x.append(22)		# 如果是可变类型则不需要nonlocal,可直接修改
    f2()
    print(‘f1内的x:‘,x)
f1()
# f1内的x: [11, 22]
评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!