1.包和模块
(1).什么是包(package)?
在Python中,用来包裹模块的文件夹,文件夹是可以当成包使用的,包并不是文件夹!!
在Python中,如果一个文件夹存在__init__.py这个模块文件的话,这个文件夹就是包,init.py一般用来初始化文件!
(2).什么是模块(module)?
xx.py文件,保存是要执行或者使用代码,以及一些自定义的模块
(2).常见的导包方式?
格式一:import package.module
格式二:import package.module as alias
格式三:from . import module (. 当前 或者 .. 上级)
格式四:from package import module as alias
格式五:from package import * #表示导入包的所有模块
注:有时候,使用一些第三方模块,会发现不能使用*导入模块,这时只有在__all__属性申明过的模块才能使用通配符导入所有模块
2.区别:is和==
is判断两个变量的内存地址,==判断两个变量的值
注:python内存中,数据区存储的常量存储固定的不变的值和一些缓冲数据。python官方(在pycharm可能范围大)做了一个小整型缓冲区(也会有字符串缓冲区),放的是**-5到256**的这些值,当变量赋值这些数时,直接拿来调用小整形缓冲区里的这些值,比较方便。
>>> a=255 #Python内存存在小整型缓冲区,范围是-5~256,所以在赋值时,就会直接调用这些值,所以两个变量的内存地址相同
>>> b=255
>>> a is b
True
>>> a=256
>>> b=256
>>> a is b
True
>>> a=257 #超过那个范围内存地址就不同
>>> b=257
>>> a is b
False
3.深浅拷贝与赋值
(1).赋值(基本数据类型):栈内存的复制,地址也复制了
>>> a=10
>>> b=a #地址传递
>>> a is b #is判断两个变量的内存地址
True
(2).拷贝:拷贝对象,对象存储在堆中,堆内存的拷贝。将对象复制之后,就拥有一个新的内存地址
1.浅拷贝:只拷贝第一层对象,子对象藕断丝连
第一种方法:列表中的copy()方法
>>> ls=[1,2,3]
>>> ls1=ls.copy()
>>> ls is ls1
False
>>> ls.append(4)
>>> ls
[1, 2, 3, 4]
>>> ls1
[1, 2, 3]
若不是列表对象,该怎么实现浅拷贝呢?这个时候就需要copy模块
第二种方法:copy模块的copy()方法
>>> import copy
>>> dir(copy)
[ 'copy', 'deepcopy']
>>> ls=[1,2,3]
>>> ls1=copy.copy(ls)
>>> ls is ls1
False
>>> ls.append(4)
>>> ls
[1, 2, 3, 4]
>>> ls1
[1, 2, 3]
>>> ls is ls1
False
注:浅拷贝并不是把对象完整的拷贝,而是只拷贝了第一层对象,如果对象中存储子对象,那么子对象还是藕断丝连
>>> ls=[1,2,[1,2]]
>>> ls1=ls.copy()
>>> ls[2].append(3)
>>> ls
[1, 2, [1, 2, 3]]
>>> ls1
[1, 2, [1, 2, 3]]
>>> ls is ls1
False
2.深拷贝:使用递归的方式拷贝,两个对象没有任何关系
方法:用copy模块的deepcopy()方法
>>> import copy
>>> ls=[1,2,[1,2]]
>>> ls1=copy.deepcopy(ls)
>>> ls[2].append(3)
>>> ls
[1, 2, [1, 2, 3]]
>>> ls1
[1, 2, [1, 2]]
>>> ls is ls1
False
3.浅拷贝与深拷贝的特殊情况:元组、字符串是不可变类型,所以深浅拷贝后,永远只有一份内存,此外还有一些特殊情况:如元组里有一个子对象时可变类型(列表)
>>> import copy
>>> t=(1,2,[1,2])
>>> t1=copy.copy(t) #浅拷贝只拷贝第一层对象,则代表t就是个元组
>>> t is t1
True
>>> t2=copy.deepcopy(t) #深拷贝递归拷贝
>>> t is t2
False
>>> t[2].append(3)
>>> t
(1, 2, [1, 2, 3])
>>> t1
(1, 2, [1, 2, 3])
>>> t2
(1, 2, [1, 2])
>>> t is t1
True
>> t is t2
False
4.怎么选择什么时候使用浅拷贝、什么时候使用深拷贝?
1、需要将当前对象拷贝的时候,一般建议拷贝为浅拷贝,(效率高,内存占有少)
2、如果说,就是需要完全分离,请使用深拷贝