函数的命名空间和作用域

1:

# 内置命名空间:python解释器
#             在打开python解释器时就已经生成,然后内置的名字如print,数据类型等也同时被加载进内存里
# 全局命名空间:自己写的代码但不是函数中的代码
#            在程序从上到下被执行过程中依次加载进内存;里面放置了所设置的所有变量名和函数名
# 局部命名空间:函数 里 的 注意:如func等设置的函数名是属于全局命名空间的  
#           在 调用函数 时生成,随着函数执行的结束,该空间随之消失。里面是函数内部定义的名字

#在局部:可以使用全局、内置命名空间中的名字
#在全局:可以使用内置命名空间中的名字,但是不能用局部中使用
#在内置:不能使用局部和全局的名字 
def input():
    print('in input now')

def func():
    input()

func()  # 函数名加一个括号代表函数的执行,去掉括号代表这个函数所在的内存地址
# func  --> 函数的内存地址
# 函数名() 函数的调用
# 函数的内存地址() 函数的调用



# 在正常情况下,直接使用内置的名字
# 当我们在全局定义了和内置名字空间中同名的名字时,会使用全局的名字
# 当我自己有的时候 我就不找我的上级要了
# 如果自己没有 就找上一级要 上一级没有再找上一级 如果内置的名字空间都没有 就报错
# 多个函数应该拥有多个独立的局部名字空间,不互相共享

def input():
    print('in input now')
def func():
    #input = 1
    print(input)
func()


def func1():
    a = 1
def func2():
    #print(a)  多个函数应该拥有多个独立的局部名字空间,不互相共享,这里a不能出现,是错的

 2:

# 作用域
# 全局作用域 —— 作用在全局 —— 内置和全局名字空间中的名字都属于全局作用域  ——globals()
# 局部作用域 —— 作用在局部 —— 函数(局部名字空间中的名字属于局部作用域) ——locals()

a = 1
def func():
    print(a)
func()
print(a)


a = 1
def func():
    global a
    a += 1
func()
print(a)

def func():
    global a
    a = 2
func()
print(a)

# 对于不可变数据类型 在局部可以查看全局作用域中的变量
# 但不能直接修改
# 如果想要修改,需要在程序的一开始添加global声明
# 如果在一个局部(函数)内声明了一个global变量,那么这个变量在局部的所有操作将对全局的变量有效

a = 222
b = 444
def func():
    x = 'aaa'
    y = 'bbb'
    print(locals()) # 使用locals查看局部命名空间的所有名字
func()
print(globals()) # 显示内置命名空间和全局命名空间的所有名字
print(locals())  # 在这里显示内容与print(globals())相同

# print(globals()) 永远打印全局的名字
# print(locals()) 输出什么 根据locals所在的位置



# 局部对变量的操作不会对全局产生影响,global声明会对全局造成修改,影响代码安全
#a = 1
def func(x):
    a = 2
    return a
#a = 1
z = func(a)
print(z)

猜你喜欢

转载自www.cnblogs.com/passengerlee/p/10348658.html