- 学习测试开发的Day132,真棒!
- 学习时间为1H
- 第11天全天课下午视频1H25M-2H05M
命名空间和作用域
变量是拥有匹配对象的名字(标识符),命名空间是一个包含了变量名称(键)
和它们各自相应的对象(值)的字典。
一个Python表达式可以访问局部命名空间和全局命名空间里的变量。如果一个
局部变量和一个全局变量重名,则局部变量会覆盖全局变量。
每个函数都有自己的命名空间。类的方法的作用域规则和通常函数的一样。
Python会智能地猜测一个变量是局部的还是全局的,它假设任何在函数内赋值
的变量都是局部的。因此,如果要给全局变量在一个函数里赋值,必须使用
global关键字,声明该变量为全局变量,否则就会认为是局部变量而重新开辟一
段空间。Global VarName的表达式会告诉Python,VarName是一个全局变量,
这样Python就不会再局部命名空间里去寻找这个变量了。函数外的list变量在函
数内使用无需声明为global
例如:我们在全局命名空间里定义一个变量money。我们再在函数内给变量money赋值,然后Python会假定money是一个局部变量。然而,我们并没有在访问前声明一个局部变量money,结果就是会出现一个UnboundLocalError的错误。取消global语句的注释就能解决这个问题。
示例代码:
#coding=utf-8
Money=2000
def AddMoney():
# 想改正代码就取消以下注释:
# global Money
Money=Money+1
print (Money)
AddMoney()
print (Money)
wrong
a=1
def add():
a=a+1
return a+1
print(add())
执行:
PS D:\0grory\day11> python .\c.py
Traceback (most recent call last):
File ".\c.py", line 5, in
print(add())
File ".\c.py", line 3, in add
a=a+1
UnboundLocalError: local variable 'a' referenced before assignment
PS D:\0grory\day11>
right
a=1
def add():
global a
a=a+1
return a+1
print(add())
执行:
PS D:\0grory\day11> python .\c.py
3
PS D:\0grory\day11>
导入模块import
导入模块(from..import...)
>>> from math import sqrt,pow
>>> print(sqrt(4))
2.0
>>> print(pow(2,3))
8.0
>>>
导入模块(reload())
a.py代码:
b=1
def add(a,b):
return a+b
class P:
pass
if __name__=="__main__":
print("hello world!")
print("hello world!")
b.py
b=10000
import a
from a import b,add,P
print(b)
print(add(1,2))
from imp import reload
reload(a)
print(P())
执行:
PS D:\0grory\day11> python b.py
1
3
PS D:\0grory\day11> python b.py
hello world!
1
3
hello world!
PS D:\0grory\day11>
注意:需要先import然后在reload,不然会报错
NameError: name 'a' is not defined
import和from…import…的区别
定位模块
当导入一个模块时,Python解析器会去搜索该模块存在的位置,其搜索顺序为:
➢ 当前目录
➢ 如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目
录,用sys.path.append来进行添加。
➢ 如果都找不到,python会查安装路径lib下的site-packages。Unix下,默认路
径一般是/usr/local/python/。
模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,
PYTHONPATH由安装过程决定的默认目录
临时生效
PS D:\0grory\day11> python
Python 3.5.2 |Continuum Analytics, Inc.| (default, Jul 5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', 'C:\\Miniconda3\\python35.zip', 'C:\\Miniconda3\\DLLs', 'C:\\Miniconda3\\lib', 'C:\\Miniconda3', 'C:\\Miniconda3\\lib\\site-packages', 'C:\\Miniconda3\\lib\\site-packages\\setuptools-23.0.0-py3.5.egg']
>>> sys.path.append("d:\\")
>>> sys.path
['', 'C:\\Miniconda3\\python35.zip', 'C:\\Miniconda3\\DLLs', 'C:\\Miniconda3\\lib', 'C:\\Miniconda3', 'C:\\Miniconda3\\lib\\site-packages', 'C:\\Miniconda3\\lib\\site-packages\\setuptools-23.0.0-py3.5.egg', 'd:\\']
>>>
PS D:\0grory\day11> python
Python 3.5.2 |Continuum Analytics, Inc.| (default, Jul 5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', 'C:\\Miniconda3\\python35.zip', 'C:\\Miniconda3\\DLLs', 'C:\\Miniconda3\\lib', 'C:\\Miniconda3', 'C:\\Miniconda3\\lib\\site-packages', 'C:\\Miniconda3\\lib\\site-packages\\setuptools-23.0.0-py3.5.egg']
>>>
PYTHONPATH
作为环境变量,PYTHONPATH由装在一个列表里的许多目录组成。
PYTHONPATH的语法和shell变量PATH的一样。
在Windows系统,典型的PYTHONPATH如下:
set PYTHONPATH=c:\python20\lib;
在UNIX系统,典型的PYTHONPATH如下:
set PYTHONPATH=/usr/local/lib/python
globals()和locals()函数
根据调用地方的不同,globals()和locals()函数可被用来返回全局和局部命名空间里的名字。
如果在函数内部调用locals(),返回的是所有能在该函数里访问的命名。
如果在函数内部调用globals(),返回的是所有在该函数里能访问的全局名字。
两个函数的返回类型都是字典。所以名字们能用keys()函数摘取。
代码:
def foo():
print("calling foo()...")
astr="bar"
anInt=23
print("foo()'s globals:",globals().keys())
print("foo()'s locals:",locals().keys())
print("__mian__'s globals:",globals().keys())
print("__mian__'s locals:",locals().keys())
foo()
执行:
PS D:\0grory\day11> python .\myglobals.py
__mian__'s globals: dict_keys(['foo', '__cached__', '__builtins__', '__package__', '__name__', '__doc__', '__spec__', '__file__', '__loader__'])
__mian__'s locals: dict_keys(['foo', '__cached__', '__builtins__', '__package__', '__name__', '__doc__', '__spec__', '__file__', '__loader__'])
calling foo()...
foo()'s globals: dict_keys(['foo', '__cached__', '__builtins__', '__package__', '__name__', '__doc__', '__spec__', '__file__', '__loader__'])
foo()'s locals: dict_keys(['astr', 'anInt'])
PS D:\0grory\day11>