Python 面试题:面向对象 1


Python 有哪些数据类型?(需要写出每种类型的常用方法)

  • 整型
  • 列表
  • 元组
  • 字典
  • 字符串
  • 集合
  • 布尔

什么是不可变对象,什么是可变对象?

  • 不可变对象:对象的具有固定的内容。如果想要让对象赋予新的内容,就只有创建新的对象。地址与值捆绑。
  • 可变对象:对象的内容可以改变。

如何创建不可变数据对象

# python 3.7 以上
from dataclasses import dataclass


@dataclass(frozen=True)
class Container:
    val: int


c = Container(2)
print(c.val)

有哪些可变对象,哪些不可变对象?

  • 不可变对象:字符串、元组、整型

  • 可变对象:数组、字典、集合

检查两个字符串是不是由相同字母不同顺序组成

查找列表中频率最高的值

反转字符串

复制列表

合并字典

字典访问不存在的key 时,如何才能不报错?

  1. 使用 defaultdict

  1. 继承dict,重构 missing 方法

类方法和静态方法有什么区别

  • 类方法是与类绑定的方法

  • 静态方法就是普通的函数,只是碰巧在类的定义体中,而不是在模块层定义。主要是让静态方法放在此类的名称空间之内,从而能够更加有组织性。

is 和 == 的区别?

  • 比较操作符'=='表示比较对象间的值是否相等,默认会调用对象的 eq() 方法,而'is'表示比较对象的标识是否相等,即它们是否指向同一个内存地址。

  • 比较操作符'is'效率优于'==',因为'is'操作符无法被重载,执行'is'操作只是简单的获取对象的 ID,并进行比较;而'=='操作符则会递归地遍历对象的所有值,并逐一比较。

深拷贝和浅拷贝的区别?

  • 浅拷贝和深拷贝只有在可变对象才会生效,不可变对象的赋值操作、浅拷贝、深拷贝的效果是一样的

  • 浅拷贝中的元素,是原对象中子对象的引用,因此,如果原对象中的元素是可变的,改变其也会影响拷贝后的对象,存在一定的副作用。

  • 深度拷贝则会递归地拷贝原对象中的每一个子对象,因此拷贝后的对象和原对象互不相关。另外,深度拷贝中会维护一个字典,记录已经拷贝的对象及其 ID,来提高效率并防止无限递归的发生