趁着有空整理一下面试题
简述*args和**kwargs的含义
首先当我们不清楚函数具体接收多少个参数时,我们就使用*args。
def t(*args):
for i in args:
print(i)
t(1,2)
out:
1
2
当我们不清楚我们要传多少个关键字参数时,使用**kwargs。
def t2(**kwargs):
for key in kwargs:
print(key)
t2(m=1,n=0)
out:
m
n
python闭包函数
如何定义一个简单的闭包函数
def outerfunc(x):
def innerfunc():
print(x)
innerfunc() 你会发现innerfunc可以获取到变量"x",而"x"并不是它的局部变量。如果我们需要改变"x",需要声明"x"是非局部变量。
声明非局部变量:
nonlocal x
复杂一些的闭包函数:
def outer(func):
def inner(msg):
func(msg)
return inner
def sayhi(msg):
print(msg)
myfunc=outer(sayhi)
myfunc("Hello")
列表和元组之间的区别是?
列表可变,元组不可变。
深拷贝,浅拷贝,直接赋值。
- 深拷贝: 将被复制对象完全再复制一遍作为独立的新个体单独存在。所以改变原有被复制对象不会对已经复制出来的新对象产生影响。
- 直接赋值: 等于赋值,并不会产生一个独立的对象单独存在,他只是将原有的数据块打上一个新标签,所以当其中一个标签被改变的时候,数据块就会发生变化,另一个标签也会随之改变。
-
浅复制分为两种情况讨论:
1)当浅复制的值是不可变对象(数值,字符串,元组)时和“等于赋值”的情况一样,对象的id值与浅复制原来的值相同。
2)当浅复制的值是可变对象(列表和元组)时会产生一个“不是那么独立的对象”存在。有两种情况:
第一种情况:复制的对象中无复杂子对象,原来值的改变并不会影响浅复制的值,同时浅复制的值改变也并不会影响原来的值。原来值的id值与浅复制原来的值不同。
第二种情况:复制的对象中有复杂子对象(例如列表中的一个子元素是一个列表),如果不改变其中复杂子对象,浅复制的值改变并不会影响原来的值。但是改变原来的值中的复杂子对象的值会影响浅复制的值。