Python 面试题:面向对象 1
Python 有哪些数据类型?(需要写出每种类型的常用方法)
- 整型
- 列表
- 元组
- 字典
- 字符串
- 集合
- 布尔
什么是不可变对象,什么是可变对象?
- 不可变对象:对象的具有固定的内容。如果想要让对象赋予新的内容,就只有创建新的对象。地址与值捆绑。
- 可变对象:对象的内容可以改变。
如何创建不可变数据对象
# python 3.7 以上
from dataclasses import dataclass
@dataclass(frozen=True)
class Container:
val: int
c = Container(2)
print(c.val)
有哪些可变对象,哪些不可变对象?
-
不可变对象:字符串、元组、整型
-
可变对象:数组、字典、集合
检查两个字符串是不是由相同字母不同顺序组成
查找列表中频率最高的值
反转字符串
复制列表
合并字典
字典访问不存在的key 时,如何才能不报错?
- 使用 defaultdict
- 继承dict,重构 missing 方法
类方法和静态方法有什么区别
-
类方法是与类绑定的方法
-
静态方法就是普通的函数,只是碰巧在类的定义体中,而不是在模块层定义。主要是让静态方法放在此类的名称空间之内,从而能够更加有组织性。
is 和 == 的区别?
-
比较操作符'=='表示比较对象间的值是否相等,默认会调用对象的 eq() 方法,而'is'表示比较对象的标识是否相等,即它们是否指向同一个内存地址。
-
比较操作符'is'效率优于'==',因为'is'操作符无法被重载,执行'is'操作只是简单的获取对象的 ID,并进行比较;而'=='操作符则会递归地遍历对象的所有值,并逐一比较。
深拷贝和浅拷贝的区别?
-
浅拷贝和深拷贝只有在可变对象才会生效,不可变对象的赋值操作、浅拷贝、深拷贝的效果是一样的
-
浅拷贝中的元素,是原对象中子对象的引用,因此,如果原对象中的元素是可变的,改变其也会影响拷贝后的对象,存在一定的副作用。
-
深度拷贝则会递归地拷贝原对象中的每一个子对象,因此拷贝后的对象和原对象互不相关。另外,深度拷贝中会维护一个字典,记录已经拷贝的对象及其 ID,来提高效率并防止无限递归的发生