今天去面试了一份python web开发的工作,结果不怎么理想,不过我会继续努力的,希望关注我公众号的你们也继续努力。努力学习python知识,找到一份好的工作,好了今天不是来给大家阐述我面试的苦恼的。
我们今天的目的是分享我遇到的几道面试题,顺便我自己也加深一下理解
这些面试题,防止忘掉,我可是面试一结束,马上就使用备忘录进行了记录的,哈哈哈,为了给各位老铁们带来真正适用的知识,我也是够拼了,好了话不都说,面试题走起。
第一题,列表推导式和生成器的优缺点
列表推导式我想大家都知道,那么它的优缺点是什么?
我们看一下代码,以及运行速度和所占内存
我们看见了什么,一个知识点的优缺点是靠对比得来的,耗费的时间
列表推导式还不到循环的一半,所以列表推导式的优点就是速度快
我们再看看生成器
看不看两者的内存,列表解析,52.9——》61.9,生成器53.0,几乎没有变,所以列表解析优点是省内存(生成器不会一次将所用的值返回,可以在需要的时候再取,因此不会有大量数据一直占用内存,)
会不会有人认为这并不是真正的节省了内存,当所有值都取完的时候呢,会不会就不节省内存了呢,我们可以试一下,得到下面的结果,内存有了一点变化,但是好事几乎没有改变,因此生成器说,省内存我是认真的。
为了给大家展示运行时间和内存消耗特意花费时间看了一下这部分的知识,好吧,其实我比较菜,花费的时间有点多。
废话不多,我们继续下一个题
第二题,深拷贝和浅拷贝的区别,并自己设计一个深拷贝.
我们不妨多学点东西,赋值
(1)直接赋值,(有人说默认浅拷贝传递对象的引用而已,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用)(有人说复制就是深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在。所以改变原有被复制对象不会对已经复制出来的新对象产生影响。 )这是两种不同的理解方式,我们不深究,我们直接看看代码运行情况再说
发生了什么不是只拷贝了对象引用吗,怎么还是变了,(数值型是不可变类型,因此再次赋值是对象地址发生改变,拷贝对象指着原来的对象地址,因此没有变化,而列表类型是可变类型改变时对象地址没有改变,因此值跟着改变,好吧其实这种说法是不对的,千万别踩这样的坑)事实是当你给可变类型重新赋值时之前的拷贝是不会变得
我们来解释一下这种现象,我们采用贴标签的方式来理解,(这种理解方法是从别人那学的,并非我自己创造的)
我们让 a = 1 ,这时给 1 所在对象地址贴一个a标签,b = a 在 1 的对象地址上继续贴上b 标签,a = 2 这是 a 标签被拿到了2 因此 1就没有了a标签,a ,b不在一个地方因此a不会影响到b。
(如果说非得区分一下,那么就是当是当重新赋值时就是深拷贝,当可变对象改变时就是浅拷贝) 这个是我个人理解,大家可以去借鉴更多的资料
(请大家按照这个思路自行理解一下,列表的改变情况)
我们继续说浅拷贝和深拷贝
(2)copy浅拷贝,没有拷贝子对象,所以原始数据改变,子对象会改变
(3)深拷贝,包含对象里面的自对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变
l1 = [1, 2, 3, [5, 6, 7]]
l2 = copy.copy(l1)
l3 = copy.deepcopy(l1)
print(l2)
print(l3)
print('\n')
l1.append(666)
print(l2)
print(l3)
print('\n')
l1[3][2] =6666
print(l2)
print(l3)
我们看到的结果可能和我们预期的不太一样,其实深拷贝和浅拷贝对于普通的列表来说都是深拷贝,原来的改变,无论是深拷贝还是浅拷贝都不会变,而对于列表里还有子列表的形式就会改变,无论是在子列表添加还是改变,浅拷贝的对象都会发生改变。
我们给出一个设计的深拷贝
def deepcopy(data):
#新建的列表
listdata = []
for i in data:
#如果i是dict类型的数据,则调用字典处理函数copydict()
if isinstance(i,dict):
dictdata = copydict(i)
listdata.append(dictdata)
#如果是元组和列表则递归调用deepcopy()函数
elif isinstance(i,list) or isinstance(i,tuple):
listdata1 = deepcopy(i)
listdata.append(listdata1)
#其他不可变类型的数据就添加到列表listdata中
else:
listdata.append(i)
return listdata
#字典类型的处理函数
def copydict(data):
dict1 = {}
#遍历字典
for keys,values in data.items():
#以下的每一步的含义与deepcopy中的相似
if isinstance(values,dict):
numdict=copydict(values)
dict1[keys]=numdict
else:
value = deepcopy(values)
dict1[keys]=value
return dict1
if __name__ == '__main__':
numlist = [[1, 2, [3, 4, 5]], 34, "number", {"name": {"fistname": "孙", "lastName": "悟空","listname":[1,2,3]}}]
numlist2 = deepcopy(numlist)
print(id(numlist[0]))
print(id(numlist2[0]))
print(numlist2)
print(numlist)
numlist.append([4,5,6])
print(numlist)
print(numlist2)
好了这次就先讲到这里,祝大家早日学成大佬级别,
扫描二维码点击关注,了解更多python知识