2213 字
11 分钟
Python 札记 (2)
2026-08-25
NOTE

基于 Python 3。

变量与赋值#

x = 10
x = "hello" # 合法:同一个变量可以先后指向不同类型

Python 中的变量不需要声明类型。同一个变量可以先后指向不同类型的对象。= 将变量名指向一个对象。

a, b = 1, 2
a, b = b, a # 交换
x = y = [] # 两个变量指向同一个列表,修改其中一个,另一个也会变化
x, y = [], [] # 两个独立的空列表

+=-= 等是增强赋值运算符。对可变对象,增强赋值可能原地修改对象。

0 < x < 10 可以这么写,等价于 0 < x and x < 10

可变与不可变#

Built-in Types 里,对象分可变不可变

不可变(常见)可变(常见)
int float complex boollist
str bytesdict set
tuple(容器本身不可变;元素若是 list 仍可改内容)bytearray

不可变对象的内容不能原地修改;重新赋值会创建新对象。可变对象可以原地修改,通过其他变量也能看到变化。

s = "hello"
# s[0] = "H" # TypeError:str 不可变
s = "Hello" # 新字符串,变量 s 指向新对象
lst = [1, 2, 3]
lst.append(4) # 原地改,id(lst) 不变
other = lst
other.append(5)
print(lst) # [1, 2, 3, 4, 5] —— 同一对象

tuple 本身不可变,但其中的可变元素(如 list)仍可以修改内容:

t = ([1, 2], 3)
t[0].append(3) # 合法
# t[0] = [9] # TypeError:不能替换 tuple 的元素

六种内置类型(总览)#

Python 常用内置类型如下(Built-in Types):

类型字面量示例要点
数字 int / float / complex42 3.14 1+2j任意精度整数、浮点、复数
字符串 str'hi' "你好"不可变文本
列表 list[1, 2, 3]有序、可变
元组 tuple(1, 2) (1,)有序、不可变;单元素要逗号
字典 dict{'a': 1}键值对;空的是 {}
集合 set{1, 2, 3}元素不重复;空集合写 set()

此外还有 boolNoneType(唯一值 None)、bytes / bytearray 等。

用内置函数探测类型:

type(42) # <class 'int'>
type([]) is list # True
isinstance(3.0, int) # False
isinstance(True, int) # True

bool 是 int 的子类#

True / Falsebool 类型的两个实例;bool 继承自 intBoolean Type)。

True == 1 # True
False == 0 # True
True + True # 2
int(True) # 1
isinstance(False, int) # True
type(True) is int # False —— 类型仍是 bool

因此 bool 可以参与算术。True is 1False。空列表、空字符串在 if 中视为假,见 Truth Value Testing

type 与 id#

  • type(obj):返回对象的类型(类)。
  • id(obj):在 CPython 中通常是对象内存地址的整数,同一时刻同一对象 id 相同;对象被回收后 id 可能复用。
a = [1, 2]
b = a
c = [1, 2]
print(id(a) == id(b)) # True —— 同一对象
print(a is b) # True
print(a is c) # False —— 值相等,对象不同
print(a == c) # True

is 比较对象身份(是否为同一个对象),== 比较值是否相等。判断是否为 None 应使用 x is None。小整数和字符串驻留可能导致 is 碰巧为真,这是实现细节。

CAUTION

相等的整数或元组上 is 有时为真,那是 CPython 小整数缓存等实现细节Comparisons 的语义是:is 只判断「是不是同一个对象」,相等用 ==。不要把 a is b 当成 a == b 的快捷写法。

类型转换#

显式转换#

内置构造函数即转换函数(Built-in Functions):

int("42") # 42
int("1010", 2) # 二进制字符串 → 10
float("3.14")
str(123)
list("abc") # ['a', 'b', 'c']
tuple([1, 2])
bool(0) # False;非零数为 True
bool("") # False;非空串为 True

转换失败抛 ValueError;具体规则以各类型文档为准。另外还有 chr / ord / repr 等。不要eval 去「转换」不可信字符串。

隐式转换#

混合数值运算时,Python 按 Numeric Types 拓宽类型。记忆口诀 bool → int → float → complex 只描述运算结果类型;bool 本身仍是 int 的子类(上一节)。不会把数字和字符串自动相加:

3 + 4.5 # 7.5,int 与 float 运算得 float
# "3" + 4 # TypeError
"3" + str(4) # "34",需显式转

布尔上下文(if / while / and / or)里会调用对象的真值测试,不是把 int 转成 bool 再存回变量。

del 语句#

del 是语句,不是函数。常见用法:

x = 1
del x # 删除变量,再访问 x 会 NameError
lst = [1, 2, 3]
del lst[0] # 删下标 0,后面元素前移 → [2, 3]
del lst[1:] # 删切片,lst 变成 [2]
d = {"a": 1}
del d["a"] # 删键 "a";键不存在则 KeyError

bytes#

Binary Sequence Typesbytes 不可变,元素是 0–255 的整数;bytearray 可变。字面量 b"hello"(内容须为 ASCII 或转义)。文本 ↔ 二进制:str.encode(encoding) 得到 bytesbytes.decode(encoding) 还原为 str,编码对不上会 UnicodeError

b = b"hi"
b[0] # 104,不是 'h'
bytearray(b"hi")[0] = 72
"你好".encode("utf-8") # b'\xe4\xbd\xa0\xe5\xa5\xbd'
b"hi".decode("ascii") # 'hi'

算术运算符#

运算符含义备注
+ - * /加 减 乘 真除/ 总是 float(3/2 → 1.5)
//地板除向负无穷取整;-7//3-3
%余数与地板除配套:a == (a//b)*b + (a%b)
**右结合:2**3**22**(3**2)
+x -x一元正负
7 // 3 # 2
-7 // 3 # -3
7 % 3 # 1
2 ** 10 # 1024

对非数字类型,+ 可能被重载(如 str 拼接、list 合并);其他算术若未定义则 TypeError

比较运算符#

链式比较:a < b <= c 等价于 a < b and b <= c,且 b 只求值一次

运算符含义
== !=相等 / 不等
< > <= >=大小(同类型或可比协议)

不同类型比较是否合法、如何比,以 Comparisons 与具体类型为准;不要依赖 Python 2 的旧规则。

赋值与增强赋值#

形式等价于(概念上)
x = expr名字绑定
x += yx = x.__iadd__(y) 或回退到 x = x + y
x //= y x **= y同理

不可变对象,+= 通常创建新对象再绑定;对 list 等,+= 往往原地扩展(extend)。若需要新列表,用 x = x + y 或切片复制,别假设所有类型行为一致。

海象运算符 :=PEP 572)在表达式内赋值。

逻辑运算符#

运算符含义短路
and全真则取最后一值左假则不再求右
or有真则取第一个真值左真则不再求右
not逻辑非返回 True/False
0 and 99 # 0(不是 False,是操作数本身)
"" or "default" # "default"
not [] # True

逻辑运算返回的是操作数对象,不一定是 bool;条件语句里再按真值规则解释。

成员与身份运算符#

运算符含义
in / not in成员测试(序列、映射、集合)
is / is not是否同一对象(比较 id
"a" in "abc" # True
1 in {1, 2} # True
x is None
x is not y

==is 勿混:小整数缓存等实现细节不应依赖 a is b 代替 a == b

位运算符#

作用于整数二进制位(Bitwise operations):

运算符含义
& | ^与、或、异或
~按位取反
<< >>左移、右移
0b1010 & 0b1100 # 0b1000 → 8
1 << 4 # 16

bool 参与位运算会先当 0/1 用。读标志位、权限掩码时会碰到。

运算符优先级#

表达式求值顺序见 Operator precedence。记不住时加括号。官方从高到低(同级除 ** 外从左到右;** 右结合,且高于左侧的一元 +/-/~,所以 -2**2-4):

级别(高→低)运算符
原子、订阅、调用(…) x[i] x() x.attr
**
一元算术 / 位+x -x ~x
乘除模* @ / // %
加减+ -
移位<< >>
位与&
位异或^
位或|
比较、成员、身份== in is
逻辑非not x
逻辑与and
逻辑或or
条件表达式x if c else y
lambdalambda
海象:=
2 + 3 * 4 # 14,不是 20
(not False) and True
2 ** 3 ** 2 # 512,即 2 ** (3 ** 2)

附录:内置类型速查#

函数作用
type(x)类型
isinstance(x, cls)是否该类型(含子类)
id(x)对象标识
len(x)长度(有 __len__ 的对象)
hash(x)哈希值(可哈希对象)

参数形式以 Built-in Functions 为准。另见 round() abs() divmod()eval 会执行代码,不要对不可信输入使用。

常见构造函数:| 函数 | 作用 | | --- | --- | | int float complex | 数值 | | str repr ascii | 文本 / 可打印表示 | | chr / ord | 码点 ↔ 单字符 | | bin oct hex | 整数 → 带前缀的进制字符串 | | list tuple set frozenset | 从可迭代对象构造 | | dict | 从键值对可迭代对象或关键字参数构造 | | bytes bytearray memoryview | 二进制视图 | | bool | 真值测试 |

附录:运算符一览#

类别运算符
算术+ - * / // % ** @(矩阵乘,NumPy 等)
比较== != > < >= <=
赋值= += -=:=
逻辑and or not
& | ^ ~ << >>
成员in not in
身份is is not

参考#

官方文档(中文版):

  1. An Informal Introduction to Python — 数字、字符串入门示例
  2. Built-in Types — 类型分类、可变/不可变、真值测试
  3. Built-in Functionsint / float / str / bool
  4. Operator precedence
  5. Assignment statements
  6. Comparisons
  7. Truth Value Testing
  8. The del statement
  9. Binary Sequence Types

PEP:

  1. PEP 572 — Assignment Expressions

菜鸟教程:

  1. 菜鸟教程 · 数据类型
  2. 菜鸟教程 · 数据类型转换
  3. 菜鸟教程 · 运算符

Python 札记 (2)
https://blog.chuwu.top/posts/python/python2/
作者
ChuwuYo
发布于
2026-08-25
许可协议
CC BY-NC-SA 4.0