1.Python语言中命名空间的使用?
如果一个命名声明为全局的,那么对它的所有引用和赋值会直接搜索包含这个模块全局命名的作用域。
如果要重新绑定最里层作用域之外的变量,可以使用 nonlocal 语句;如果不声明为 nonlocal,这些变量将是只读的(对这样的变量赋值会在最里面的作用域创建一个新的局部变量,外部具有相同命名的那个变量不会改变)。通常,局部作用域引用当前函数的命名。
在函数之外,局部作用域与全局使用域引用同一命名空间:模块命名空间。类定义也是局部作用域中的另一个命名空间。
重要的是作用域决定于源程序的意义:一个定义于某模块中的函数的全局作用域是该模块的命名空间,而不是该函数的别名被定义或调用的位置,了解这一点非常重要。另一方面,命名的实际搜索过程是动态的,在运行时确定的——然而,Python 语言也在不断发展,以后有可能会成为静态的“编译”时确定,所以不要依赖动态解析!(事实上,局部变量已经是静态确定了。)
Python 的一个特别之处在于:如果没有使用 global 语法,其赋值操作总是在最里层的作用域。赋值不会复制数据,只是将命名绑定到对象。
删除也是如此:del x 只是从局部作用域的命名空间中删除命名 x 。事实上,所有引入新命名的操作都作用于局部作用域。
特别是 import 语句和函数定义将模块名或函数绑定于局部作用域(可以使用 global 语句将变量引入到全局作用域)。global 语句用以指明某个特定的变量为全局作用域,并重新绑定它。
nonlocal 语句用以指明某个特定的变量为封闭作用域,并重新绑定它。
2.到底什么是程序集?和命名空间到底是什么关系?一段代码?一个文件
命名空间:就像你硬盘里的文件夹, 不同的文件夹下存放不同的文件(类),这样就可以避免文件全部堆在一个地方引起混乱(同理, 这样你就可以为不同的模块建立命名空间,这样就可以使类和容易管理), 并且可以避免多个同名文件无法放在一个文件夹下。
程序集:。NET编写的DLL和EXE就是程序集。
程序集包括: 1、程序集清单,包含程序集元数据。 2、类型元数据。
3、实现这些类型的 Microsoft 中间语言 (MSIL) 代码。 4、资源集。
所以这两个概念其实是不同的东西,没有什么联系。只是一般建立类库项目(DLL)的时候会用默认的命名空间来命名程序集文件,这样很容易使人把这两个东西联系起来。
3.python怎么用命名空间写程序
大概一般人也不会在程序里去直接修改名字空间里的内容 举个栗子 >>> globals(){'__builtins__':
4.python怎么用命名空间写程序
大概一般人也不会在程序里去直接修改名字空间里的内容
举个栗子
>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, '__package__': None}
>>> globals()['name'] = 'bigbang'
>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, 'name': 'bigbang', '__package__': None}
>>> globals()['name'] = 'taeyang'
>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, 'name': 'taeyang', '__package__': None}
>>> del globals()['name']
>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, '__package__': None}实际上无论是哪种名字空间,存储的都是一个字典类型的数据,修改字典内容就可以啦。
5.python命名空间包导入算法
要理解命名空间包,需从底层去学习包导入操作在Python 3.3中是如何完成的。
在导入过程中,3.3版本与3.2和之前的版本一样,依旧会遍历模块搜索路径sys.path中的每个目录。然而,在3.3版本中,当对每个模块搜索路径中的directory搜索名为spam的被导人包时,Python会按照下面的顺序测试一系列更广的匹配条件:1.如果找到directory\spaml_init__.py,便会导入一个常规包并返回。
2.如果找到directoryspam.ipy,pyc,或其他模块扩展名},便会导人一个简单模块并返回。3.如果找到文件夹directorylspam,便会将其记录下来,而扫描将从搜索路径中的下一个目录继续。
4.如果上述的所有都没有找到,扫描将从搜索路径中的下一个目录继续。如果搜索路径扫描结束后没有从上述步骤1和步骤2中返回一个模块或包,而同时在上述步骤3中至少记录了一个路径,那么就会创建一个命名空间包。
命名空间包的创建会立即发生,而且不会推迟到一个子层级的导入发生之时。新的命名空间包有一个_path_属性,该属性被设置为在上述步骤3中扫描并记录的目录路径字符串的可迭代对象,但是没有_file_属性。
path_属性在随后更深的访问过程中用于搜索所有包组件。命名空间包的_path_中每个被记录的项目,都会在进一步嵌套的项目被请求时进行搜索,这很像一个常规包的单独路径。
从另一方面看,命名空间包的_path_属性对于更低层次组件的关系,和sys.path对于顶层最左侧的包导入路径的关系是一样的。命名空间包成为了访问更低层次项目的“父路径”,这一访问也使用了上面介绍的四个步骤。
最终的结果是一个命名空间包是一种对多个目录的虚拟拼接,这些目录可以位于多个sys.path项目中。然而一旦一个命名空间包被创建,它和一个常规包之间并没有功能上的区别,它能够支持我们所学过的常规包的一切功能,包括包相对导入语法。
6.python命名空间问题
Traceback (most recent call last):
File "", line 1, in
f()
File "", line 2, in f
a = a+1
UnboundLocalError: local variable 'a' referenced before assignment
首先,在f()这个函数里,a是个局部变量。原因:没加global a这一句。
然后,函数内容一上来就调用了a本身的值。对于python来说,它这时还不知道a是什么呢。
所以,这个错误的意思是说,a作为一个局部变量,没有先声明数值就被引用了,无从查找其值。
转载请注明出处编程代码网 » python项目命名空间管理(Python语言中命名空间的使用?)