python 模块==命名空间?

起因: 想利用模块传递某个变量,修改某个变量的值,且在其它模块中也可见

于是我做了这样一个实验:

[email protected]:vearne/test_scope.git

base.py

value = 10

b.py

import base
def hello():
    print ‘scope base‘, base.value, id(base.value)

main.py

from base import value
from b import hello
print ‘scope base‘, value, id(value)
value = 20
print ‘scope local‘, value, id(value)
hello()

运行python main.py

输出结果如下:

[‘__builtins__‘, ‘__doc__‘, ‘__file__‘, ‘__name__‘, ‘__package__‘, ‘hello‘, ‘value‘]
scope base 10 140195531889072
[‘__builtins__‘, ‘__doc__‘, ‘__file__‘, ‘__name__‘, ‘__package__‘, ‘hello‘, ‘value‘]
scope local 20 140195531888832
scope base 10 140195531889072

大家可以看出,value 的值并没有被修改,并且id值(对象的内存地址) 不一致,因此我们得出结论, value 和 base.value 存在在不同位置,是两个不同的对象。

阅读python官方文档

https://docs.python.org/2/tutorial/modules.html

我找到这样一段话

Each module has its own private symbol table, which is used as the global symbol table by all functions defined in the module. Thus, the author of a module can use global variables in the module without worrying about accidental clashes with a user’s global variables. On the other hand, if you know what you are doing you can touch a module’s global variables with the same notation used to refer to its functions, modname.itemname.

Modules can import other modules. It is customary but not required to place all import statements at the beginning of a module (or script, for that matter). The imported module names are placed in the importing module’s global symbol table.

每个模块有一个自己的符号表,当我们引入一个模块时,这个符号表中的内容就会被修改,使用dir() 可以查看当前模块的符号表中的符号列表

看下面的列子:

print ‘------------------‘
a = 15
print dir()
print ‘------------------‘
import math
print dir()
print ‘------------------‘
from datetime import timedelta
print dir()

运行结果如下:

------------------
[‘__builtins__‘, ‘__doc__‘, ‘__file__‘, ‘__name__‘, ‘__package__‘, ‘a‘]
------------------
[‘__builtins__‘, ‘__doc__‘, ‘__file__‘, ‘__name__‘, ‘__package__‘, ‘a‘, ‘math‘]
------------------
[‘__builtins__‘, ‘__doc__‘, ‘__file__‘, ‘__name__‘, ‘__package__‘, ‘a‘, ‘math‘, ‘timedelta‘]

最后回到前面的例子:

from base import value
value = 20  # 这里我们并没有修改模块base中value的值,而是重新定义了一个本地变量, 并且符号表中的指向已经被修改了(指向一个本地变量value)
...

其实这么看python的模块还有点像命名空间,隔离同名变量,防止命名冲突

参考资料:

https://docs.python.org/2/library/datetime.html

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-07 12:07:29

python 模块==命名空间?的相关文章

【Python】Python模块

Python模块 可以把python代码存放在文件中,为一些脚本或者交互式的解释器实例使用,这个文件被称为模块. 模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py 模块可以被别的程序引入,以使用该模块中的函数等功能.这也是使用python标准库的方法.下面是一个使用Python标准库中模块的例子 import sys print('命令行参数如下:') for i in sys.argv: print(i) print('/n/nThe PYTHONPATH is', sys.pat

python模块导入原理

转自:http://blog.csdn.net/u012422440/article/details/41791433 今日在自学Python,借此机会,正好重新开始写博文,既可以巩固python的知识,也可顺便提高一下文笔. 一.python模块基础 言归正传,Python的模块是python语言中代码复用的最高级别,也是系统命名空间的的划分标准,也是供顶层文件(就是包含程序主要控制流程的部分)调用的工具库文件.实现模型其实很简单,任何一个python文件都可以当做模型通过import进行导入

模块命名空间

# -*- coding: utf-8 -*- #python 27 #xiaodeng #模块命名空间 #模块最好理解为变量名的封装,也就是定义想让系统其余部分看见变量名的场所. #python会建立模块对象,以包含模块文件内所赋值的所有变量名 #模块就是命名空间,而存在于模块之内的变量名就是模块对象的属性 #在模块文件的顶层每一个赋值了的变量名都会变成该模块的属性 #下面正式的来说明模块加载和作用域的概念以了解其原因? #模块语句会在首次导入时执行 #系统中,模块在第一次被导入时,无论在什么

Python之命名空间、闭包、装饰器

一.命名空间 1. 命名空间 命名空间是一个字典,key是变量名(包括函数.模块.变量等),value是变量的值. 2. 命名空间的种类和查找顺序 - 局部命名空间:当前函数 - 全局命名空间:当前模块 - 内建命名空间:所有Python环境,所有模块 查找顺序 1.先在当前 (嵌套的或 lambda) 函数的命名空间中搜索 2.然后是在父函数的命名空间中搜索 3.接着是模块命名空间中搜索 4.最后在内置命名空间中搜索 要到内置命名空间都没找到的话,就会弹出NameError 这里看一个例子 i

Python/模块与包之包

Python/模块与包之包 1. 包是一种通过使用模块名 来组织Python模块名称空间的方式,一个类似于目录并存有__init__.py文件的被称为包 包的本质就是一个包含__init__.py文件的目录.包A和包B下有同名模块也不会冲突,如A.a与B.a来自俩个命名空间 无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉:这是关于包才有的导入语法 包 通常包总是一个目录,可以使用import导入包,或者from + i

Python/模块与包之模块

Python/模块与包之模块 1.什么是模块? 模块就是py文件 2.为什么要用模块? 如果在解释器上进行编码,把解释器关闭之前写的文件就不存在了,如果使用模块的话就能永久保存在磁盘中. 3.如何使用模块? 3.1 import    通过import导入要使用的模块 1 #spam.py 2 print('from the spam.py') 3 4 money=1000 5 6 def read1(): 7 print('spam->read1->money',1000) 8 9 def

python模块与包

模块是包括python定义和声明的文件.文件名=模块名+".py".模块名保存在全局变量__name__中. 1.模块中的执行语句,只是在导入时执行一次.这些语句通常用于初始化模块. 2.被导入的模块被放到全局语义表中. 3.import用法 +import moduleName +from moduleName import moudleContent +from moudleName import * 导入所有的除了以下划线开头的命名. 4.导入module查找路径:先从当前目录中

Python Namespace - 命名空间

命名空间 命名空间 namespace 对 python 来说是一个非常核心的概念,整个 python 虚拟机运行的机制与 namespace 概念有这非常紧密的联系. 从'赋值'说起, python 中的赋值语句是一类特殊的语句,原因是因为它们会影响 namespace. python 中的赋值语句首先创建一个 对象 object,然后将 obj '赋值' 给一个名字 name (理解为赋值给一个变量) 赋值语句执行后, 我们的一个 name 和 object 的关联关系, 称之为'约束',

Python 模块day13

模块让你能够有逻辑地组织你的Python代码段. 把相关的代码分配到一个 模块里能让你的代码更好用,更易懂. 模块也是Python对象,具有随机的名字属性用来绑定或引用. 简单地说,模块就是一个保存了Python代码的文件.模块能定义函数,类和变量.模块里也能包含可执行的代码. 例子 一个叫做aname的模块里的Python代码一般都能在一个叫aname.py的文件中找到.下例是个简单的模块support.py. def print_func( par ):    print "Hello :