「Python」2020.05.13学习笔记 | 第七章异常和模块之命名空间和作用域、导入模块、pythonpath、globals和locals()

  • 学习测试开发的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

image.png

导入模块(from..import...)

image.png
>>> from math import sqrt,pow
>>> print(sqrt(4))
2.0
>>> print(pow(2,3))
8.0
>>>

导入模块(reload())

image.png

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…的区别

image.png

定位模块

当导入一个模块时,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>

你可能感兴趣的:(「Python」2020.05.13学习笔记 | 第七章异常和模块之命名空间和作用域、导入模块、pythonpath、globals和locals())