python高级编程1

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值