中国网站建设世界排名,网站开发 项目职责,有主体新增网站,用符号做照片的网站在Python中#xff0c;对象是独立的#xff0c;不同作用域中的不同名字都可以被绑定在同一个对象上#xff0c;当然对这个对象的修改会影响所有的引用。赋值操作就是名字和对象的绑定或重绑定。这和C中的引用是一样的。 1#xff0c;基础概念 1.1 命名空间#xff08;name…在Python中对象是独立的不同作用域中的不同名字都可以被绑定在同一个对象上当然对这个对象的修改会影响所有的引用。赋值操作就是名字和对象的绑定或重绑定。这和C中的引用是一样的。 1基础概念 1.1 命名空间namespace A namespace is a mapping from names to objects 命名空间是名字和对象的映射。也就是可以把一个namespace理解为一个字典实际上很多当前的Python实现namespace就是用的字典。各个命名空间是独立的没有任何关系的所以一个命名空间中不能有重名但不同的命名空间是可以重名而没有任何影响。 那么哪些可以是一个namespace呢比如Python的built-in names包括内置函数内置常量内置类型一个模块的global names这个模块定义的函数类变量一个函数的所有local names还有一个类对象的所有属性数据成员成员函数都组成一个命名空间。 命名空间都是有创建时间和生存期的。对于Python built-in names组成的命名空间它在Python解释器启动的时候被创建在解释器退出的时候才被删除对于一个Python模块的global namespace它在这个module被import的时候创建在解释器退出的时候退出对于一个函数的local namespace它在函数每次被调用的时候创建函数返回的时候被删除。 总结一个模块的引入函数的调用类的定义都会引入命名空间函数中的再定义函数类中的成员函数定义会在局部namespace中再次引入局部namespace。 1.2 作用域scope A scope is a textual region of a Python program where a namespace is directly accessible. 作用域是Python程序文本的某一段或某些段在这些地方某个命名空间中的名字可以被直接引用。这个作用域就是这个命名空间的作用域。 一个Python程序的几个作用域 最里面的局部作用域外层函数的局部作用域模块的全局作用域包含Python内置对象的最外层作用域 关于作用域参加Python基础函数这片博客中2小节的例子。 1.3 赋值assignment Assignments do not copy data — they just bind names to objects. 赋值操作不会拷贝只是把名字和对象做一个绑定。也就是赋值语句是起一个绑定或重绑定的作用bind or rebind。函数调用的参数传递是赋值不是拷贝。 2global和nonlocal语句 global语句用来声明一系列变量这些变量会引用到当前模块的全局命名空间的变量modulelevel namespace如果该变量没有定义也会在全局空间中添加这个变量。 global var1, var2 nonlocal语句nonlocal是Python3.2引入的 Python2.7中还没有nonlocal语句。nonlocal语句用来声明一系列的变量这个声明会从声明处从里到外的namespace去搜寻这个变量the nearest enclosing scope直到模块的全局域不包括全局域找到了则引用这个命名空间的这个名字和对象若作赋值操作则直接改变外层域中的这个名字的绑定。nonlocal语句声明的变量不会在当前scope的namespace字典中加入一个key-value对如果在外层域中没有找到则如下报错。 SyntaxError: no binding for nonlocal spam found 一个nonlocal和global的测试例子 1 def test():2 def do_local():3 spam local spam4 def do_nonlocal():5 nonlocal spam 6 spam nonlocal spam7 def do_global():8 global spam9 spam global spam
10 spam test spam
11 do_local()
12 print(after local assignment:, spam) #输出test spam
13 do_nonlocal()
14 print(after nonlocal asssignment:, spam) #输出nonlocal spam
15 do_global()
16 print(after global assignment:, spam) #输出nonlocal spam
17
18 test()
19 print(in global scope:, spam) #输出global spam 第5行的语句nonlocal spam 没有在函数do_nonlocal()的域中创建一个变量而是去引用到了外层的10行定义的spam。 第8行的global spam在全局域中创建了一个name9行将其绑定在字符串常量对象global spam上。 跟进一步测试nonlocal 1 def test():2 def do_nonlocal():3 nonlocal spam4 def do_nonlocal2():5 nonlocal spam6 spam nonlocal2 spam 修改了test()中spam的绑定7 do_nonlocal2()8 spam test spam9 do_nonlocal()
10 print(after nonlocal2 asssignment:, spam) 输出nonlocal2 spam
11 test() do_nonlocal2()中的spam引用的是其外面的二层也就是test()函数域中的spam。 参考 http://docs.python.org/3.3/tutorial/classes.html#python-scopes-and-namespaces Python文档 http://docs.python.org/3.2/reference/simple_stmts.html Python文档simple statement转载于:https://www.cnblogs.com/livingintruth/p/3296010.html