【python高级01-包、模块、赋值、拷贝】

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、如果说,就是需要完全分离,请使用深拷贝

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑着蜗牛追汤圆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值