python全栈闯关--10-一、命名空间和做用域

一、引子

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

函数func中,可使用函数外的变量a,这就涉及到命名空间和做用域。python

 

二、命名空间

命名空间分三种函数

一、内置命名空间 —— python解释器spa

  内置命名空间在python一启动的时候就可使用code

  内置的名字,启动解释器的时候,就加载进内存里blog

二、全局命名空间 —— 本身写得代码但不是函数中的代码内存

  从下到下执行代码的时候加载进内存作用域

  存放了设置的变量名和函数名input

三、内置命名空间 —— 函数class

  函数内部定义的名字变量

  当函数调用时,才产生这个命名空间,随之函数的执行结束,这个命名空间也就消失

 

在局部:可使用全局和内置命名空间的名字

在全局:可使用内置命名空间中的名字,可是不能用局部命名空间的

在内置:不能使用全局和局部命名空间中的名字

def max(l):
    print("in max func")
print(max([1,2,3,4]))

执行结果

 

正常状况下,咱们能够直接使用内置的名字

可是,若是在全局定义了和内置名字同样的名字是,会使用全局的名字

多个函数,拥有多个独立的局部命名空间,不共享

 

三、函数的调用和地址

def input():
    print("in input now!")

def func():
    print(input)  # 打印的结果为函数的地址,并不会执行函数
func()

func → 不加括号,获取的是函数的地址

 函数名()→ 调用函数

函数的内存地址()→ 调用函数

 

四、做用域

全局做用域 —— 做用全局 —— 内置和全局命名空间中的名字都属于全局做用域 —— gloabs()

局部做用域 —— 做用局部 —— 函数(局部命名空间中的名字属于局部做用域)  —— locals()

# 在全局做用域,globals和locals同样
print(globals())
print(locals())

# 在局部做用域,globals显示全局做用域的名字,locals只显示局部做用域的名字
def func():
    a = 1
    b = 2
    print(globals())
    print(locals())
func()

globals()永远打印全局名字

locals()根据local所在位置,打印

 

对于全局做用域的不可变数据类型的变量,在局部做用域不可变。

若是须要修改,须要使用global参数申明

a = 1
def func1():
    a += 1  # 更改全局的变量,报错local variable 'a' referenced before assignment
func1()

a = 1
def func1():
    global a
    a += 1  # 更改全局的变量,因为申明了global a程序能够执行
func1()
print(a)  # 由于申明了global,变量改变

 

使用global参数,更改变量的值,存在危险性。

不看函数代码时,没法知道变量是否改变。

所以,在改变全局域变量时,采起传值——返回值的方式进行

a = 1
def func(a):
    a = 2
    return a
a = func(a)
print(a)
相关文章
相关标签/搜索