Python3-Namespaces and Scope in Python

Python中的名字空间(Namespace)和作用域(Scope)

python的名字空间是指python中对于每个对象都有一个单独的名字。这个对象可能是一个变量,也可能是一个方法。Python以python字典的格式来储存名字空间。以计算机的文件系统为例,不同的文件夹中可以有相同名字的文件,但是依旧可以根据绝对路径来区分这些名字相同的文件。Python的解释器就是通过识别名字空间来理解代码中具体变量和方法。所以namespace其实分为两部分,第一部分是name,即一个独特的命名,第二部分是space,即与位置相关。

namespaces的类型

build-in namespace:Python内置的namespaces,如print()、id()等,这些namespace是指当没有任何用户自定义的module、method、class等的时候,Python本身会存在的一些namespace。

global namespace:全局namespace,当用户创建了一个module时,就创建了一个全局的namespace。

local namespace:局部namespace,在用户自定义的module中创建局部的函数,即创建了一个局部的namespace。

build-in namespace > global namespace > local namespace

namespace的有效期

namespace的有效期取决于对象的作用域,超出对象的作用域,namespace无效。无法从外部namespace访问内部namespace中的对象。

在不同的名字空间中可以存在相同名字的对象,如下面例子中的var1=3在全局namespace中,而var1=2和var2=3在local namespace中,因此直接在外部访问var1只能得到3,无法得到2,并且无法访问local namespace中的var1和var2.

 1>>> #var1 is in the global namespace
2>>> var1=3
3>>> ###var1 and var2 are in the local namespace
4>>> def test():
5    var1=2
6    var2=3
7
8>>> 
9>>> var1
103
11>>> var2
12Traceback (most recent call last):
13  File "<pyshell#36>", line 1in <module>
14    var2
15NameError: name 'var2' is not defined

如果在一个local namespace中需要对一个位于global namespace中的对象进行操作,则需要在local namespace中指定该对象为global,否则无法访问,或者访问的是local namespace中同名的对象。如

 1>>> count=5
2>>> def test():
3    count=count+1
4    print(count)
5
6>>> test()
7Traceback (most recent call last):
8  File "<pyshell#6>", line 1in <module>
9    test()
10  File "<pyshell#5>", line 2in test
11    count=count+1
12UnboundLocalError: local variable 'count' referenced before assignment
13>>> 
14>>> count=5
15>>> def test():
16    global count
17    count=count+1
18    print(count)
19
20>>> test()
216
22>>> 
23>>> count=5
24>>> def test():
25    count=1
26    count=count+1
27    print(count)
28
29
30>>> test()
312
32>>> 

python中对象的scope(作用域)

scope是指一个特定的对象可以被访问的代码区域。

 1>>> def fun1():
2    print("inside fun1")
3    def fun2():
4        var=10
5        print("inside fun2, value of var:",var)
6    fun2()
7    print("print var from fun1:",var)
8
9>>> fun1()
10inside fun1
11inside fun2, value of var: 10
12Traceback (most recent call last):
13  File "<pyshell#51>", line 1in <module>
14    fun1()
15  File "<pyshell#50>", line 7in fun1
16    print("print var from fun1:",var)
17NameError: name 'var' is not defined

在这个例子中,fun1中嵌套了fun2,fun2中定义的变量var只能在fun2的代码区域中被访问,而在其外部的函数fun1中无法被访问。


原文始发于微信公众号(BioInfo):Python3-Namespaces and Scope in Python

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/238236.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!