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. 引用:引用是建立了变量和对象之间的关系,即某个变量指向了某个对象,二者之间的关系便是引用
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__
这个属性本身占用内存,且是动态绑定,所以当实例过多时,内存占用也多