python作用域总结
将Python与C++的作用域规则对比理解试一下
下面将Python与C++的作用域规则对比理解试一下:
我个人认为python与C++在作用域上的最大区别就是块作用域的区别。python中是没有块作用域的,比如很多人在python中使用的第一个循环语句:
for i in range(10):
print(i)
12
大家是不是认为这类比C++或Java等语言的话就是下面这样:
for (int i=0; i<10; i++){
System.out.println(i);
}
123
的确这两个运行的结果是一样的,但是最大的区别是:java中的变量i在循环结束后是被销毁的,因为超出了自己的作用域。而python的话i还是在它所归属的函数或模块的作用域内,比如将语句做一个更改:
for i in range(10):
print(i)
print(i) # 结果是9
123
有人可能会问了,C++中有类作用域,命名空间作用域,而python只有模块作用域和内置模块作用域啊?
其实你可以把python中的函数+外部嵌套函数作用域应用到类作用域上是一样的,模块作用域其实可以类比全局作用域。而C++中的命名空间作用域在python中已经实现了,python不允许直接调用其他模块的名字空间,要加上文件名.变量才可以访问到,也就不存在不同模块间重名的问题了。
模块内变量作用域
局部变量:只能作用域局部
全局变量:引用全局变量,不需要golbal声明,修改全局变量,需要使用global声明,特别地,列表、字典等如果只是修改其中元素的值,可以直接使用全局变量,不需要global声明。
原因:因为存在既可以表示引用全局变量a,也可以表示创建一个新的局部变量a的歧义,所以python默认指定创建一个新的局部变量来消除这一歧义。
参考作用域网站:链接: link.
模块间作用域(import)
局部变量:import其他模块后 其他模块局部变量不可以用
全局变量:import其他模块后其他模块全局变量需使用(模块名.全局变量名)才可使用,其他模块函数调用方法同理。
from 其他模块 import* 后其他模块全局变量可用,且不需要 模块名.全局变量的方式,直接 全局变量即可
from 其他模块 import b后其他模块全局变量b可用,直接b 即可。
if name == 'main’下的变量:
由于import其他模块时if name == 'main’下的数据全没导入,故不可用。
使用 from 其他模块 import b后其他模块的b也还是不可用
总结
1.其他模块的局部变量只有其他模块中的局部可用
(如果是本模块调用其他模块函数或者类,函数中局部变量都是新创建的,可在本模块该函数或者类下使用)
2.其他模块if name == 'main’下的变量只可在其他模块全局使用
3.其他模块下的全局变量可通过import和from…import…使用。
注:from a import b.py可以导入文件夹a中的b模块