2488 字
12 分钟
Python 札记 (2)
2026-08-25
NOTE

目录骨架来自菜鸟教程 Python3 基础章节,表述与细节对照 Python 官方文档 与相关 PEP 核对。基于 Python 3。完整出处见文末 参考

变量与赋值#

Python 里没有「声明变量类型」的语法。名字通过赋值语句绑定到对象;同一个名字可以重新绑定到别的对象、别的类型。

x = 10
x = "hello" # 合法:名字换绑到新对象

赋值语句的完整语义见 Assignment statements。先记住:

  • =绑定,不是数学里的「等式」。
  • 多重赋值:a, b = 1, 2(右侧是可迭代对象,左侧是目标列表)。
  • 增强赋值:+=-= 等,对可变对象可能是原地修改(见下文)。
a, b = 1, 2
a, b = b, a # 交换,无需临时变量
x = y = [] # 两个名字绑到**同一个**列表对象,改一个会影响另一个
x, y = [], [] # 两个独立空列表,更安全

链式比较是 Python 特色:0 < x < 10 等价于 0 < x and x < 10Comparisons)。

可变与不可变#

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 的槽位

后面写 list / dict 时还会碰到这一区分:改的是名字绑的对象,还是对象本身。

六种内置类型(总览)#

菜鸟教程把 Python 内置类型归纳成六类;官方 stdtypes 按协议与实现展开。入门对照表:

类型字面量示例要点
数字 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 1is 比较身份,见后文)。条件、循环里「空容器为假」等规则见 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 比较身份(是否同一对象),== 比较(是否 __eq__ 相等)。判断是否为 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] # 删除元素,见第 4 篇
del lst[1:]
d = {"a": 1}
del d["a"] # 删除键,见第 5 篇

bytes 入门#

Binary Sequence Typesbytes 不可变,元素是 0–255 的整数;bytearray 可变。字面量 b"hello"(内容须为 ASCII 或转义)。文本 ↔ 二进制用 str.encode / bytes.decode,第 3 篇再写。

b = b"hi"
b[0] # 104,不是 'h'
bytearray(b"hi")[0] = 72

算术运算符#

运算符含义备注
+ - * /加 减 乘 真除/ 总是 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)在表达式内赋值,控制流篇再展开;知道存在即可。

位运算符#

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

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

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

逻辑运算符#

运算符含义短路
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

运算符优先级#

表达式求值顺序见 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)哈希值(可哈希对象)

常见构造函数:int() float() complex() str() bool() list() tuple() dict() set() frozenset() bytes() bytearray()。另见 round() abs() divmod()(数字篇)。参数形式以 Built-in Functions 为准。

菜鸟 数据类型转换 有一张总表,下面按官方函数核对后列出(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