博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
名称空间与作用域
阅读量:5104 次
发布时间:2019-06-13

本文共 2216 字,大约阅读时间需要 7 分钟。

目录

名称空间与作用域

名称空间

名称空间(name spaces):

name = 'zkim' 就是在内存中开辟了一个新的空间,用来存放zkim,而namezkim具有绑定关系,我们能通过name找到zkim。那么name又存放在哪呢?...其实在内存中有一块内存存储变量名与变量间绑定关系的空间,而这个空间称之为名称空间。

  • 内置名称空间

内置名称空间:存放Python解释器自带的名字,如 print,len,int 等等。

生命周期:在Python解释器启动的时候生效,在解释器关闭的时候失效。

  • 全局名称空间

全局名称空间:除了内置和局部的名字之外,其余都存放在全局名称空间。如 x,func,l,z

x = 1          # x 存放于全局名称空间print(x)l = [1, 2]     # l 存放于全局名称空间print(l)if 3 > 2:    if 4 > 3:        z = 3  # z 存放于全局名称空间print(z)def func():    # func 存放于全局名称空间    passprint(func)
# 1# [1, 2]# 3# 

生命周期:在文件执行时生效,在文件执行结束后失效。

  • 局部名称空间

局部名称空间:用于函数调用期间,存放函数体产生的名字。如f2

def f1():    def f2():  # f2 在f1的局部名称空间中        print('from f2')    f2()    f1()
# from f2

生命周期:在文件执行时函数调用期间生效,在函数执行结束后失效。

名称空间的加载顺序

1:python解释器先启动,因而首先加载的是:内置名称空间。

2:执行test.py文件,然后以文件为基础,加载全局名称空间。

3:在执行文件的过程中如果调用函数,则临时产生局部名称空间。

名字的查找顺序

  • 查找顺序只能是依次往上找:

内置名称空间--->全局名称空间--->内置名称空间

  • 从当前所在的位置开始查找:

当前在局部名称空间时:局部--->全局--->内置

当前在全局名称空间时:全局--->内置

# len = 1  全局名称空间   没有依次往上查找def f1():    # len = 2  f1的局部名称空间   没有依次往上查找    def f2():        # len =3  f2的局部名称空间   没有依次往上查找        print(len)  # 从f2的局部名称空间开始查找 len 的值    f2()f1()print(len)  # 当全局中找不到的时候回去内置中查找
# 内置中查找的结果:

作用域

  • 域指的就是区域,作用域即作用的区域。

  • 全局作用域

全局有效,全局存活,包含内置名称空间和全局名称空间。

x = 1def func():    print(x)func()
1
  • 局部作用域

局部作用域:局部有小,临时存储,只包含局部名称空间。

x = 1def func():    print(x)    def func2():    x = 2    func()func2()
1

函数对象+作用域应用

def f1():    def inner():        print('from inner')    return inner  # 将函数名 inner 当作返回值f = f1()  # f = innerdef bar():    f()  # inner()bar()
# from inner

global 与 nonlocal 关键字

  • global 与 nonlocal 能够修改多个变量,如:
# global x,y,z  依次以逗号隔开# nonlocal x,y,z  依次以逗号隔开
  • global 关键字
# 修改类型为不可变数据类型name = 'jason'  # 全局变量def f1():    name = 'nick'        def f2():        global name  # 修改全局变量的值        name = 'egon'    f2()f1()print(name)
# egon
  • nonlocal 关键字
name = 'jason'def f1():    name = 'nick'  # 局部变量        def f2():        nonlocal name  # 修改局部变量的值        name = 'egon'    f2()    print(name)f1()
# egon
  • 注意点

1:在局部想要修改全局的可变类型,不需要任何声明,可以直接修改。

2:在局部如果想要修改全局的不可变类型,需要借助 global 声明,声明为全局的变量,即可直接修改。

lis = []def func():    lis.append(['jsaon','tank','nick','egon'])  # 一个列表整体代表一个元素func()print(lis)
[['jsaon', 'tank', 'nick', 'egon']]

转载于:https://www.cnblogs.com/jincoco/p/11165226.html

你可能感兴趣的文章
存储分类
查看>>
下一代操作系统与软件
查看>>
【iOS越狱开发】如何将应用打包成.ipa文件
查看>>
[NOIP2013提高组] CODEVS 3287 火车运输(MST+LCA)
查看>>
Yii2 Lesson - 03 Forms in Yii
查看>>
Python IO模型
查看>>
Ugly Windows
查看>>
DataGridView的行的字体颜色变化
查看>>
java.nio异步线程安全的IO
查看>>
(网上摘抄)云标签
查看>>
记录-时间日期
查看>>
便签:
查看>>
JS function 函数基本定义方法
查看>>
Java再学习——关于ConcurrentHashMap
查看>>
bzoj3944 Sum
查看>>
后缀表达式/逆波兰表达式
查看>>
标准模板库中的优先队列(priority_queue)
查看>>
如何处理Win10电脑黑屏后出现代码0xc0000225的错误?
查看>>
局域网内手机访问电脑网站注意几点
查看>>
IT项目经验和难点分享
查看>>