学习笔记之--GIL、深拷贝和浅拷贝、装饰器

python 提高

1.GIL 全局解释锁,Cpython遗留问题,保证线程执行的时间片内只有一个线程在执行,在遇到耗时的IO操作是会暂时释放该锁,让其他线程执行。这样也能提升执行效率。
2.深拷贝和浅拷贝:简单来说浅拷贝是拷贝指向,深拷贝是完全拷贝内容。 假如:
a = [1,2]
b= [3,4]
c = [a,b]
d = copy.copy(c)

在上面这个程序段中,是一个浅拷贝,d会拷贝c中指向的变量所指向的内存位置。
假如是深拷贝的话:

a = [1,2]
b= [3,4]
c = [a,b]
d = copy.decopy(c)

那么d会拷贝内容,简单来说就是假如a指向[1,2] b指向[3,4],d会拷贝c中指向a,b指向的内存位置的内容,在另一个内存中生成新的[1,2],[3,4]
假如我们去改变a列表的值。

a.append(4)

然后分别去输出浅拷贝和深拷贝的d的值
会发现,浅拷贝中d的值也发生了改变,而深拷贝中的d没有发生改变,因此
浅拷贝是复制变量的指向,而深拷贝是复制变量指向的内存并且在新的内存空间生成一模一样的值。

特例:
元组、
如果进行copy.copy,对象是一个元组,那么不会进行浅拷贝,仅仅只是指向了。

原因:元组是一个不可变类型,意味着数据不可改变,如果进行copy.copy那么它会自动进行判断,如果是元组仅仅指向了

假如元组仅仅只有不可变类型,那么深拷贝和浅拷贝都是一样的,
如果元组里存在可以改变的类型,例如列表,那么copy.copy和上述没有区别,但是深拷贝将会正常进行。

3.装饰器

下面定义一个简单的装饰器

def decorat_test(func):
	def wrapper(*arg, **kwargs):
		'''一堆乱七八糟的处理'''
		return func(*arg, **kwargs)
	return wrapper

装饰器的用法只需要在需要装饰器的函数上面使用@装饰器名就能过达到效果,当同时有多个装饰器装饰同一个函数时,谁先来先装饰谁。
假如:

@decorat_test
def test():
	return 'ok'

@decorat_test相当于执行 test = decorat_test(test)
这样一个通用的装饰器就做好了,不管test函数有没有ruturn 都可以执行

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值