Python面试3小题(一)

一、Python中赋值,浅拷贝和深拷贝的区别?
参考博客:https://www.cnblogs.com/xueli/p/4952063.html
1、赋值
在python中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用。也就是说,对象赋值,两个变量共用的是一个地址。

>>> b=alist
>>> print b
[1, 2, 3, ['a', 'b']]
>>> alist.append(5)
>>> print alist;print b
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b'], 5]

2、浅拷贝
copy浅拷贝,如其字义,只拷贝了浅层,没有拷贝深层的子对象。如list中还带有其他list,那么这些其他list就没有拷贝,和赋值一样,属于公共部分。所以原始数据中深层子对象改变了,被拷贝的变量的子对象会改变。

>>> import copy
>>> c=copy.copy(alist)
>>> print alist;print c
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']]
>>> alist.append(5)
>>> print alist;print c
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b']]
>>> alist[3]
['a', 'b']
>>> alist[3].append('cccc')
>>> print alist;print c
[1, 2, 3, ['a', 'b', 'cccc'], 5]
[1, 2, 3, ['a', 'b', 'cccc']] 里面的子对象被改变了

3、深拷贝
deepcopy深拷贝,包含对象里面的所有对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变。

>>> import copy
>>> d=copy.deepcopy(alist)
>>> print alist;print d
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']]始终没有改变
>>> alist.append(5)
>>> print alist;print d
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b']]始终没有改变
>>> alist[3]
['a', 'b']
>>> alist[3].append("ccccc")
>>> print alist;print d
[1, 2, 3, ['a', 'b', 'ccccc'], 5]
[1, 2, 3, ['a', 'b']]  始终没有改变

二、lamda表达式
lambda只是一个表达式,函数体比def简单很多,很多时候定义def,然后写一个函数太麻烦,这时候就可以用lambda定义一个匿名函数。
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
可以参考:https://blog.csdn.net/yinxingtianxia/article/details/78121815

三、python的for循环与迭代器、生成器
不清楚的可以参考博客:https://www.cnblogs.com/scolia/archive/2016/05/30/5538666.html,写的很详细。

猜你喜欢

转载自blog.csdn.net/qq_21578849/article/details/85089982