python 名称空间和作用域

目录

  名称空间

  名称空间分类

  生命周期

  名称空间内的查找顺序

  作用域

名称空间

  名称空间:名称空间即存放名字与对象映射/绑定关系的地方.

    列如:对于x=3,Python会申请内存空间存放对象3,然后将名字x与3的绑定关系存放于名称空间中,del x表示清除该绑定关系。

  访问变量值:想访问一个变量的值,就必须到名称空间去找,找到后才能访问变量名的值

名称空间的分类

  内置名称空间:python解释器中定义好的名字

    例如:

len()
max()
min()

  全家名称空间:

    伴随python文件的开始执行,执行完毕而产生/回收,是第二批被加载的名称空间,文件执行过程中产生的名字都会存放于该名称空间中,如下名字

import sys #模块名sys

x=1 #变量名x

if x == 1:
    y=2 #变量名y

def foo(x): #函数名foo
    y=1
    def bar():
        pass

Class Bar: #类名Bar
	pass	

  局部名称空间: 函数内部所创建的变量名都属于局部名称空间

def index():
    x = 1

生命周期

  内置名称空间:Python解释器启动就立马创建,关闭解释器名称空间销毁

  全局名称空间:运行.py文件创建,.py文件程序运行结束语自动销毁

  局部名称空间:函数被调用时创建, 函数执行结束销毁

名称空间的寻找

len = "全局名称空间"
def func():’】=
    len = '局部名称空间' 
    print(len)
print(len)  # 全局名称空间
# 注释掉len = "全局名称空间",得到<built-in function len>

  

    

总结:

  1.必须先确定你当前所在位置(前提) 1.站在全局:全局-->内置 2.站在局部:局部-->全局-->内置

  2.函数在定义阶段查找名字的顺序就已经固定了, 不会因为函数的调用位置变化而变化.

作用域

  按照名称空间作用范围的不同,可以把其分为两个区域:

  全局作用域:位于全局名称空间、内置名称空间的名字,名字全局作用域。

  局部作用域:位于局部名称空间的名字,名字作用域局部

案例

  1. global 局部变量修改全局变量(不可变类型)

x = 1
name = 'jason'

def func():
    global x, name
    x = 2
    name = 'egon'

func()
print(x)
print(name)

  2.nonlocal 局部变量修改局部变量

def func():
    x = 2
    def index():
        nonlocal x
        x = 3
    index()
    print(x)

func()

  

 

posted @ 2020-03-30 10:56  zhuang6  阅读(95)  评论(0编辑  收藏  举报