一、赋值、浅拷贝、深拷贝的区别?
1、赋值:就是创建了对象的一个新的引用,修改其中任意一个变量都会影响另一个,他们共用一个地址。即赋值之后没有额外的内存开销。
# 当我们使用is判断的时候,返回为True a = [1,2,3] b=a a is b # 输出为True # 当然我们也可以使用id()函数来查看,看两个变量的地址是否相同。
2、浅拷贝:会创建新的对象,其内容非原对象本身的引用,而是原对象内第一层对象的引用。
a = [1, 2, 3] # 几种形式 # 切片操作 b = a[:] # 或者 b = [x for x in a] # 工厂函数 b = list(a) # copy函数 import copy b = copy.copy(a)
注意:浅拷贝产生的列表b不再是列表a了,用is判断可以发现他们不是同一个对象,用id查看他们也不指向同一片内存空间,但是我们使用for循环查看内部元素地址的时候,可以看到二者包含的元素的地址是相同的。
对于内部元素是列表:修改第一层的元素,他们不会互相影响,但是修改第二层元素以及之后的,会互相影响。[1,[2, 3], [4, 5]] 这里1指的是第一层元素,2、3指的是第二层元素。
对于内部元素是元组 :元组是不可变元素,修改了元组之后,指向了新的地址,所以不会互相影响。
3、深拷贝:只有一种形式,即copy.deepcopy()函数,拷贝了对象的所有元素,包含多嵌套的元素,这样修改列表b根本不会影响列表a,即深拷贝拷贝出来的对象是一个全新的对象,与原来的对象没有任何的联系。避免了浅拷贝的问题。
import copy a = [1, 2, 3] b = copy.deepcopy(a) id(a) # 1668072346632 id(b) # 1668072346824 a is b # False
总结:可以看到,深拷贝的两个变量的id完全不相同。
二、什么是lambda函数?有什么好处?
匿名函数: 可以理解为函数的简写形式。
基本形式: lambda 变量:函数体
常用用法: 在参数列表中最适合使用匿名函数,尤其时与key = 搭配。
# lambda后接参数,在调用匿名函数的时候需要传入 # 冒号右边是函数的返回值 add = lambda x, y: x+y add(1, 2) # 等价于 def add(x, y): return x+y # lambda函数也可以作为其他函数的实际参数使用。 # 按照特定条件排序,与key = 搭配。 ls = [(21,31), (22,51)] temp = sorted(ls, key=lambda x: x[0]+x[1])