python 常见面试题整理(1)

趁着有空整理一下面试题

简述*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值与浅复制原来的值不同。

    第二种情况:复制的对象中有复杂子对象(例如列表中的一个子元素是一个列表),如果不改变其中复杂子对象,浅复制的值改变并不会影响原来的值。但是改变原来的值中的复杂子对象的值会影响浅复制的值。

Life is more than the present.