009_作用域

1,作用域

  • 全局作用域:作用域编写的整个程序;
  • 局部作用域:作用域函数内部范围;
  • 不同的局部作用域是独立的,不同域的函数可以使用相同的参数名。
  • 局部作用域可以引用上级的局部作用域的变量,但是不可以修改。
  • 在局部作用域,如果用了本域没有的变量就会向上级查找。
  • 各自作用域的内的变量随着各自域的释放而释放,即函数内的变量随着函数的调用产生,随着函数的结束释放。
2,默认参数陷阱
  • 如果默认参数的值是一个可变数据类型,那么每一次调用函数的时候,如果不赋值就公用这个数据类型的资源
def func(k = []):
    k.append(1)
    print(k)

func()      #>>>[1]
func([])    #>>>[1]
func()      #>>>[1,1]
func()      #>>>[1,1,1]
 
3,函数名与内置函数名同名时
    在正常情况下,直接使用内置函数的名字,调用内置函数但当我们在全局定义了和内置空间函数名相同时,会使用全局的名字
    遵循原则,当自己有的时候就不在找上级要如果自己没有,就找上一级要,上级没有在再找上上级,如果内置空间都没有就报错
def input():
    print('全局input')

input()     >>>全局input
4,函数名地址
def input():
    print('全局input')

def func():
    print(input)    #打印函数input()的地址

func()      #>>><function input at 0x0000023EBD04D378>
  •  func指向一个地址,地址加()时一个函数的执行
  •  func————>函数的内存地址
  •  函数名()————>函数的调用
  •  函数的内存地址()————>函数的调用
5,函数调用全局变量
  • 对于不可变数据类型 ,在局部可以查看全局作用域中的变量,但是不能直接修改    
  • 如果想要在局部作用域修改全局变量,需要在程序的一开始添加global声明    
  • 如果在一个局部(函数)作用域内声明了一个global变量,那么这个变量在局部的所有操作即是对全局变量的操作
a = 1
def func():
    print(a)        #局部可以查看全局变量

func()      #>>>1
a = 1
def func2():
    a += 1          #报错,局部不能更改全局变量
a = 1
def func3():
    global a        #声明变量a是全局变量a,修改即修改的全局变量a
    a += 1

func3()
print(a)    #>>>2
a=3
def func2():
    a=0         #没有特殊声明,这是局部作用域func2函数范围的变量a
    a += 1
    print(a)

func2()         #>>>1
print(a)        #>>>3
6,查看局部变量,全局变量
  • globals永远打印全局作用域的
  • locals 意为:本地的,打印locals所在位置的作用域
a = 1
b = 2
def func():
    x = '风'
    y = '雨'
    print(locals())   #查看局部变量  #>>>{'x': '风', 'y': '雨'}

func()
print(globals())      #查看全局变量  #输出的结果往后看

print(globals())
print(locals())     #此时打印的都一样,都是全局

  

猜你喜欢

转载自www.cnblogs.com/eternity-twinkle/p/10500882.html
009