Python面试

1. Python是什么

2. 赋值、浅拷贝和深拷贝的区别https://www.cnblogs.com/kb-python/p/15998681.html

1. 赋值:就是简单对象的引用,并不会开辟新的内存空间,如下图,当a改变时,b的值也会跟随改变

a = 1
b = a
id(a) == id(b) # True

2. 浅拷贝:会创建新的对象,其内容非原对象本身的引用,而是原对象内第一层对象的引用,当原对象中的可变对象改变时,拷贝对象也会跟着改变

3. 深拷贝:从堆内存中开辟一个新的区域,对对象中的子对象进行递归拷贝,拷贝前后的两个对象互不影响

3. init和new的区别

1. new是一个静态方法,而init是一个实例方法

2. new方法会返回一个创建的实例,而init什么都不返回

3. 只有在new返回一个cls实例时后面的init才被调用

4. 当创建一个新实例时调用new,初始化实例调用init

4.Python的变量,对象和引用

1. 变量:变量就是指针,存放对象的引用,变量分为可变变量和不可变变量

2. 对象:对象就是分配的一块内存+存储的值,对象有地址(ID),类型(TYPE),值(VALUE)

3. 引用:引用是建立了变量和对象之间的关系,即某个变量指向了某个对象,二者之间的关系便是引用

image

5. Python的作用域

1. 局部作用域L:即函数中定义的变量

2. 嵌套的父级函数的局部作用域E:即包含此函数的上级函数的局部作用域,但不是全局

3. 全局变量G:模块级别定义的变量

4. 系统固定模块的变量B:比如int,byte等,搜索变量的优先顺序是:局部作用域>外层作用域>当前模块的全局变量>Python内置作用域,也就是LEGB

6. 创建百万级实例如何节省内存

方法:定义类的__slot__属性,用它来声明实例属性的列表,用来减少内存空间

class User1:
    def __init__(self, name):
        self.name = name


class User2:
    __slots__ = ["name", "id"]

    def __init__(self, id, name):
        self.name = name
        self.id = id

if __name__ == '__main__':
    u1 = User1("jack")
    u2 = User2("tom", 10)

查看下u1和u2属性差别

set(dir(u1)) - set(dir(u2))
# 输出: {'__weakref__', '__dict__'}

因为__dict__这个属性本身占用内存,且是动态绑定,所以当实例过多时,内存占用也多

posted @ 2022-10-10 15:53  KB、渣科  阅读(21)  评论(0编辑  收藏  举报