目录
Please enable Javascript to view the contents

Python — 速查手册

 ·  ☕ 2 分钟

1. 数据类型

类型说明语法
NoneType空值None
int整型5, -10
float浮点型3.14, -0.5
str字符串(不可变)"world", 'hello'
bool布尔True, False
list有序、可变[1, 1, 3]
tuple有序、不可变(1, 1, 3)
set无序、唯一元素{1, 2, 3}
dict键值对{'name': 'hex'}

2. 列表与元组的区别

列表(list)元组(tuple)
可变性可增删改不可变
语法[]()
方法append/remove/popcount/index
内存更大(预留扩容空间)更小
可作为 dict key不可以可以

使用场景:需要动态修改用列表,固定的集合(如函数返回多个值、配置常量)用元组。元组可哈希,可作字典键。

3. GIL 与线程安全

CPython 的 GIL(Global Interpreter Lock)只保证单条字节码的原子性,不保证复合操作的安全性。

操作线程安全?原因
x = 1单条字节码
x += 1多条字节码:LOAD + ADD + STORE,线程可能在任意点切换
list.append(1)CPython 中 append 是原子操作
list[0] += 1读 + 加法 + 写,可分片执行

依赖 GIL 来做线程安全是错误的方式。需要线程安全时使用:

  • threading.Lock:互斥锁
  • queue.Queue:线程安全队列
  • collections.deque:线程安全双端队列

4. 可变对象作为默认参数

1
2
3
4
5
6
def add_item(item, target=[]):  # 陷阱
    target.append(item)
    return target

print(add_item(1))  # [1]
print(add_item(2))  # [1, 2]  ← 预期是 [2]

默认参数 [] 在函数定义时只创建一次,多次调用共享同一个列表对象。

正确写法:

1
2
3
4
5
def add_item(item, target=None):
    if target is None:
        target = []
    target.append(item)
    return target

5. 浅拷贝与深拷贝

1
2
3
4
5
6
7
8
9
import copy

a = [[1, 2], [3, 4]]
b = a[:]              # 浅拷贝:外层容器复制,内部元素共享
c = copy.deepcopy(a)  # 深拷贝:递归复制所有对象

a[0].append(99)
print(b[0])  # [1, 2, 99] ← 受到了影响
print(c[0])  # [1, 2]      ← 不受影响
浅拷贝深拷贝
外层容器复制复制
内层对象共享引用递归复制
[:] / list.copy()
copy.copy()
copy.deepcopy()
分享

Hex
作者
Hex
CloudNative Developer