「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 <module>
    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
<a.P object at 0x00000203F6F96EB8>
PS D:\0grory\day11> python b.py
hello world!
1
3
hello world!
<a.P object at 0x00000195AEB56EB8>
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>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352