1- 探究细节
import导入模块
1. import 搜索路径
import sys sys.path
路径搜索
-
从上面列出的目录里依次查找要导入的模块文件
-
' ' 表示当前路径
程序执行时导入模块路径
sys.path.append('/home/itcast/xxx') sys.path.insert(0, '/home/itcast/xxx') #可以确保先搜索这个路径
2. 重新导入模块
模块被导入后,import module
不能重新导入模块,重新导入需用
测试模块内容
调用模块中的方法
修改测试模块
重新加载模块
作用域
什么是命名空间
随便喊一声“美女”,看看有多少人回头
比如有一个学校,有10个班级,在7班和8班中都有一个叫“小王”的同学,如果在学校的广播中呼叫“小王”时,7班和8班中的这2个人就纳闷了,你是喊谁呢!!!如果是“7班的小王”的话,那么就很明确了,那么此时的7班就是小王所在的范围,即命名空间
test.py
num = 200 def print_num(): print("----print_num func, num=%d----"%num)
main.py
from test import * num = 100 def print_num2(): print("----print_num2 func, num=%d----"%num) print_num()#调用test命名空间中的print_num函数,它会使用test命名空间中的全局变量 print_num2()#调用当前命名空间中print_num2函数,它会使用当前命名空间中的全局变量
运行python3 main.py
结果如下:
----print_num func, num=200---- ----print_num2 func, num=100----
globals、locals
在之前学习变量的作用域时,经常会提到局部变量和全局变量,之所有称之为局部、全局,就是因为他们的自作用的区域不同,这就是作用域
locals
globals
==、is
>>> a = 1000 >>> b = 1000 >>> a == b True >>> a is b False
总结
- is 是比较两个引用是否指向了同一个对象(引用比较)。
- == 是比较两个对象的值是否相等(值比较)。
对象值比较(==)的定义
class Person(object): def __init__(self, name): self.name = name p1 = Person("王胖胖") p2 = Person("王胖胖") print("p1 == p2: %s" % (p1 == p2)) # False print("p1 is p2: %s" % (p1 is p2)) # False
定义__eq__方法,重新实现==比较方法
class NewPerson(object): def __init__(self, name): self.name = name def __eq__(self, person_obj): """执行==时调用的方法""" return self.name == person_obj.name np1 = NewPerson("王胖胖") np2 = NewPerson("王胖胖") print("np1 == np2: %s" % (np1 == np2)) # True print("np1 is np2: %s" % (np1 is np2)) # False
深拷贝、浅拷贝
1. 浅拷贝 copy.copy
- 浅拷贝是对于一个对象的顶层拷贝
通俗的理解是:拷贝了引用,并没有拷贝内容
2. 深拷贝 copy.deepcopy
- 深拷贝是对于一个对象所有层次的拷贝(递归)
3. 注意点
浅拷贝对不可变类型和可变类型的copy不同
使用copy模块功能的时候,它会根据当前拷贝的数据类型是可变类型,还是不可变类型,有不同的处理方式。
In [88]: a = [11,22,33] In [89]: b = copy.copy(a) In [90]: id(a) Out[90]: 59275144 In [91]: id(b) Out[91]: 59525600 In [92]: a.append(44) In [93]: a Out[93]: [11, 22, 33, 44] In [94]: b Out[94]: [11, 22, 33] In [95]: In [95]: In [95]: a = (11,22,33) In [96]: b = copy.copy(a) In [97]: id(a) Out[97]: 58890680 In [98]: id(b) Out[98]: 58890680
对于可变类型(列表)第一层相当于深拷贝独立开辟内存
对于不可变类型(元祖),就是浅拷贝,直接复制的是引用地址
4. 拷贝的其他方式
- 分片表达式可以赋值一个序列
a = "abc" b = a[:]
- 字典的copy方法可以拷贝一个字典
d = dict(name="zhangsan", age=27) co = d.copy()
- 有些内置函数可以生成拷贝(list)
a = list(range(10))
b = list(a)
- copy模块中的copy函数
import copy a = (1,2,3) b = copy.copy(a)