1.python中的包
python中以某某.py,结尾的文件,不叫包,而是模块。包相当于与一个文件夹,模块就好比是文件,包中的包含模块。但在包中有_init_.py的文件。
注意:包是文件夹,但文件夹不一定是包
常见导包方式:
import 包.模块
from 包.模块 as 别名
from package import 模块
from package1,package2,........form 模块
from package import * 导入包中的所有模块
2. “is” 和 “==”的区别
is 和 == 都是用来比较的,is 是用来比较地址的 。== 是用来比较值得。
>>> a = 257
>>> b = 257
>>> id(a)
2250236066672
>>> id(b)
2250236066512
>>> a == b
True
>>> a is b
False
在python中数据区,存的都是 固定不变的值 缓存数据等 常量 ,该数据区中有一个小整形缓存区当值的范围在(-5~256)这个范围内时,该范围内的一个值同时给不同变量赋值时,其地址是不变的(意思就是这两个变量用的时同意个内存地址),在该数据区中还有一个,字符串缓存区,不包含特殊字符,在变量赋值时,变量用的是同一个内存地址。
>>> a = 10
>>> b = 10
>>> id(a)
2250234227280
>>> id(b)
2250234227280
>>> t = "a^&"
>>> h = "a^&" $包含特殊字符的字符串
>>> id(t)
2250236307888
>>> id(h)
2250236307952
>>> t = "^" #只是单个字符,不管是不是特殊字符都是用同一个地址
>>> h = "^"
>>> id(t)
2250236307824
>>> id(h)
2250236307824
3.浅拷贝和深拷贝
引用赋值(基本数据类型)------主要操作的是栈内的复制
>>> a = 10
>>> b = a
>>>
10
>>>b
10
浅拷贝:拷贝对象 ,对象是存在堆中,拷贝类容实则是拷贝堆内存。
>>> lis = [1,2,3,4]
>>> type(lis)
<class 'list'>
>>> s = lis.copy()
>>> s
[1, 2, 3, 4]
python中提供了拷贝对象的模块,copy 模块。
copy.copy()----浅拷贝,相当于列表中的方法,copy()
>>> import copy
>>> lis = [1,2,3,4,5,6]
>>> ls = lis.copy()
>>> ls
[1, 2, 3, 4, 5, 6]
>>> ls1 = copy.copy(lis)
>>> ls1
[1, 2, 3, 4, 5, 6]
>>> a = [1,2,3,4,[1,2,3,4],8]
>>> b = copy.copy(a)
>>> a
[1, 2, 3, 4, [1, 2, 3, 4], 8]
>>> b
[1, 2, 3, 4, [1, 2, 3, 4], 8]
>>> a[4].append(10)
>>> a
[1, 2, 3, 4, [1, 2, 3, 4, 10], 8]
注意:前拷贝只拷贝了一层,最外面的一层。因此当原来的里面的变了,通过copy的也要跟着改变。
深拷贝: copy.deepcopy() 深拷贝,会从最外层一直拷贝到最里层,因此不会与浅拷贝一样,里层变了会跟着变。深拷贝不管拷贝的对像怎么变,拷贝(copy)的是不会跟着改变。
>>> ls
[1, 2, 3, [1, 2, 3, 6], 4, 6]
>>> ls1 = copy.deepcopy(ls)
>>> ls1
[1, 2, 3, [1, 2, 3, 6], 4, 6]
>>> ls[3].append("哈哈哈")
>>> ls
[1, 2, 3, [1, 2, 3, 6, '哈哈哈'], 4, 6]
>>> ls1
[1, 2, 3, [1, 2, 3, 6], 4, 6]
浅拷贝:只拷贝一层,效率高,占用内存会少
特殊情况:不可变类型(元组、字符串、数值)浅拷贝和深拷贝永远只有一份(因为只有一层)
>>> t = (1,2,3,[1,2,3],4)
>>> tt = copy.copy(t)
>>> ttt = copy.deepcopy(t)
>>> t
(1, 2, 3, [1, 2, 3], 4)
>>> tt
(1, 2, 3, [1, 2, 3], 4)
>>> ttt
(1, 2, 3, [1, 2, 3], 4)
>>> t is tt
True
>>> t is ttt
False
>>> id(t)
2352598582672
>>> id(tt)
2352598582672
>>> id(ttt)
235259805878
当不可变类型中的元素中有有可变类型,那么,浅拷贝时的地址是不会改变的,但是深拷贝时地址会发生变化。
python高级编程2--生成器及装饰器(闭包):https://blog.csdn.net/m0_55785131/article/details/121753698