1.1 作用域
1.1.1 作用域简介
域 ==》区域
直白来讲就是产生作用的区域
在程序中指的就是变量生效的区域
y = 2 def fn(): x = 1 y = 3 print(x) # x只能在函数内部使用 print('函数内部=',y) fn() print('函数外部=',y) # 输出结果: # 1 # 函数内部= 3 # 函数外部= 2
1.1.2 全局作用域
生命周期:全局作用域在程序执行时创建,在程序执行结束时销毁
所有函数以外的都是全局作用域
在全局作用域中定义的变量都属于全局变量,全局变量可以再程序的任意位置被访问
1.1.3 函数作用域
生命周期:在函数调用时创建,在调用结束时销毁
在函数作用域中定义的变量,都可以叫做局部变量,这个变量只能在函数的内部被访问
每调用一次就会产生一个函数作用域
def fn():
a=10
print("a",a)
fn()
def fn():
a=10
print("内部a=",a)
print("外部a=",a) # 报错,访问不到函数内部a
def fn1():
a = 30
def fn2():
print(a) # 可以从里往外看
fn2()
fn1()
def fn1():
def fn2():
a = 10
print(a) # 不能从外往里看
fn1()
# 使用变量的时候,会优先在当前作用域中寻找该变量,如果有就使用,没有则继续往上一级作用域寻找,如果全局作用域都没有就会报错
def fn1():
a = 20
def fn2():
a = 10
print('a1=', a)
fn2()
print('a2=', a)
fn1()
# 结果
# a1= 10
# a2= 20
global 关键字
a = 1
def fn():
global a # 声明在函数内部使用a是全局变量
a = 2
print('内部a=',a)
fn()
print('外部a=',a)
# 结果
# 内部a= 2
# 外部a= 2
总结:
1.基本就是 里面能看到外面的,但是外面不能看到里面的
2.如果局部修改全局变量可以加上一个global关键字 由内往外可以访问,但是由外往内是访问不了的
1.2 命名空间
指的是变量存储的位置
全局作用域有全局的命名空间,用来保存全局变量
函数作用域有函数的命名空间,用来保存局部变量或者说是函数中的变量
实际上就是一个字典,是一个专门存储变量的字典
locals():获取当前作用域的命名空间
print(locals())
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000002950C033DC0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/untitled/demo/day_9/作用域和命名空间.py', '__cached__': None}
a = 1
def fn():
pass
print(locals().keys())
dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', '__file__', '__cached__', 'a', 'fn'])
a = 1
def fn():
b = 1
print(locals()) # {'b': 1}
fn()
global ——》全局 nonlocal——》局部 内嵌函数中使用 用来在函数或其他作用域中使用外层(非全局)变量
def f1():
a = 1
def f2():
a = 2
print("内部a=",a)
f2()
print("外部a=",a)
f1()
# 结果
# 内部a= 2
# 外部a= 1
def f1():
a = 1
def f2():
nonlocal a
a = 2
print("内部a=",a)
f2()
print("外部a=",a)
f1()
# 结果
# 内部a= 2
# 外部a= 2
全局 = 大方的人==》我的东西你们都可以用
局部 = 小气的人==》我的东西只有我能用