在准备 Python 相关的面试时,有些问题几乎是必会问的题。
这些问题虽然基础,但如果回答的不清楚,很容易给面试官留下基础不扎实的印象。
这篇文章整理了 5 道 Python 面试中最常见的基础题,并结合简单的示例进行解释,帮助大家不仅能够回答问题,还能真正的理解背后的原理。
当然,这也仅仅是我个人在准备面试过程中整理出来的题目,如果大家有不同意见,欢迎提出!
一、Python 的主要特点是什么?
简答版
Python 是一种 解释型、动态类型的高级编程语言 ,语法简洁、可读性强,并且拥有丰富的标准库和第三方库,因此开发效率非常高,被广泛应用于 Web开发、数据分析、人工智能、自动化运维等领域。
简答版2更精简一些
Python 是一种解释型、动态类型的语言,语法简单,拥有非常丰富的第三方库,因此开发效率比较高。
详细解析
Python 之所以流行,很大程度上来源于它的几个核心特点。
1 解释型语言
Python 是 解释型语言,代码不需要编译成机器码再执行,而是由解释器逐行执行。
例如:
python
print("Hello Python")
运行时,Python解释器会直接解释并执行这行代码。
优点:
-
开发效率高
-
调试方便
-
跨平台能力强
缺点:
- 运行速度通常比编译型语言(如C、C++)慢一些
2 动态类型语言
Python 是 动态类型语言,变量在运行时才确定类型。
例如:
python
x = 10 # int
x = "hello" # str
同一个变量可以在不同时间指向不同类型的数据。
优点:
-
编码更加灵活
-
不需要声明变量类型
缺点:
-
容易产生类型错误
-
大型项目需要良好的代码规范
3 语法简单,可读性强
Python 的设计哲学之一是:
代码应该像自然语言一样容易理解
例如对比 Python 和 Java:
python
for i in range(5):
print(i)
java
for(int i=0;i<5;i++){
System.out.println(i);
}
可以明显看出 Python 更简洁。
4 丰富的标准库和第三方库
Python 生态非常强大,例如:
常见库:
-
数据分析:
pandas -
科学计算:
numpy -
机器学习:
scikit-learn -
深度学习:
tensorflow、pytorch -
爬虫:
requests、scrapy -
Web开发:
django、flask
因此 Python 也被称为:
"胶水语言(Glue Language)"
因为它可以把各种系统快速连接起来。
二、Python 列表(List)和元组(Tuple)的区别
这是 Python 面试中 非常高频的问题。
简答版
Python 中:
| 类型 | 是否可变 |
|---|---|
| List | 可变 |
| Tuple | 不可变 |
列表可以修改元素,而元组创建后不能修改。
详细解析
1 List(列表)
列表是 可变序列。
python
a = [1, 2, 3]
a[0] = 100
print(a)
#输出 [100, 2, 3]
列表支持很多操作:
-
增加
-
删除
-
修改
-
排序
2 Tuple(元组)
元组是 不可变序列。
python
t = (1, 2, 3)
t[0] = 100
# 运行报错 TypeError: 'tuple' object does not support item assignment
因为元组创建后 元素不能被修改。
为什么需要 Tuple?
很多人刚学 Python 时会问:
既然 list 可以用,为什么还要 tuple?
主要原因有三个。
1 、Tuple 更安全
不可变意味着:
- 数据不会被意外修改
例如:
python
config = ("127.0.0.1", 3306)
2 、Tuple 速度更快
因为 tuple 不可变,所以 Python 可以进行一些优化。
一般来说:
tuple 的访问速度会略快于 list
3 、Tuple 可以作为字典 key
Python 字典要求 key 必须是可哈希(hashable)的。
list 不行:
python
d = {[1,2]: "hello"} # 报错
tuple 可以:
python
d = {(1,2): "hello"} # 可行
三、Python 深拷贝和浅拷贝
在 Python 中,变量本质上是 对象的引用。
因此复制对象时,需要区分:
-
浅拷贝
-
深拷贝
简答版
浅拷贝:
只复制对象本身,但内部对象仍然共享引用。
深拷贝:
递归复制整个对象结构。
浅拷贝示例
python
import copy
a = [[1,2], [3,4]]
b = copy.copy(a)
b[0][0] = 100
print(a)
# 输出:
# [[100, 2], [3, 4]]
原因:
-
外层列表被复制
-
内层列表仍然共享引用
深拷贝示例
python
import copy
a = [[1,2], [3,4]]
b = copy.deepcopy(a)
b[0][0] = 100
print(a)
# 输出:
# [[1, 2], [3, 4]]
深拷贝会 完全复制所有层级的数据结构。
总结对比
| 类型 | 复制对象 | 复制子对象 |
|---|---|---|
| 浅拷贝 | ✔ | ✖ |
| 深拷贝 | ✔ | ✔ |
四、Python 的 GIL 是什么?
这是 Python 面试中 非常经典的问题。
简答版
GIL(Global Interpreter Lock)是 Python 的全局解释器锁。
它保证在同一时刻 只有一个线程执行 Python 字节码。
为什么需要 GIL?
Python 使用 引用计数机制进行内存管理。
例如:
python
a = []
b = a
对象的引用计数会增加。
如果多个线程同时修改引用计数,就可能产生:数据竞争、内存错误
因此 Python 通过 GIL 保证线程安全。
GIL 的影响
GIL 会影响 多线程的并行能力。
CPU密集型任务
例如:大量计算、数学运算
多线程无法利用多核 CPU。
解决方案:
使用 多进程 multiprocessing。
IO密集型任务
例如:网络请求、文件读写
线程在等待 IO 时会释放 GIL,因此:多线程仍然有效
常见场景:爬虫、Web服务器
五、Python 字典为什么这么快?
Python 字典是 使用频率非常高的数据结构。
简答版
Python 字典底层使用 哈希表(Hash Table)实现。
通过 key 的 hash 值直接定位存储位置,因此查找复杂度接近 O(1)。
字典查找过程
当执行:
python
d["name"]
大致步骤是:
1 计算 key 的 hash 值
2 根据 hash 值计算数组索引
3 找到对应位置的数据
因此查找非常快。
示例
python
d = {
"name": "Alice",
"age": 20
}
print(d["name"])
时间复杂度:O(1)
哈希冲突
如果两个 key 的 hash 值相同,就会发生 哈希冲突。
Python 会通过:开放寻址法(Open Addressing)
来寻找新的位置。
面试延伸知识
Python 字典还有几个重要特点:
1 、Python3.7 之后字典有序
例如:
d = {"a":1, "b":2, "c":3}
遍历顺序就是:
a b c
2 、字典扩容机制
当哈希表使用率过高时,Python 会:
-
自动扩容
-
重新计算索引
以保证查找效率。