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 是比较两个引用是否指向了同一个对象(引用比较)。
  • == 是比较两个对象的值是否相等(值比较)。

对象值比较(==)的定义

View Code

定义__eq__方法,重新实现==比较方法

View Code

深拷贝、浅拷贝

1. 浅拷贝 copy.copy

  • 浅拷贝是对于一个对象的顶层拷贝

通俗的理解是:拷贝了引用,并没有拷贝内容

2. 深拷贝 copy.deepcopy

  • 深拷贝是对于一个对象所有层次的拷贝(递归)

 

3. 注意点

浅拷贝对不可变类型和可变类型的copy不同

 使用copy模块功能的时候,它会根据当前拷贝的数据类型是可变类型,还是不可变类型,有不同的处理方式。

View Code

对于可变类型(列表)第一层相当于深拷贝独立开辟内存

对于不可变类型(元祖),就是浅拷贝,直接复制的是引用地址 

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)
原文地址:https://www.cnblogs.com/zhangyangcheng/p/8150179.html