Python 变量真这么简单?从标签模型到内存引用,从可变对象到作用域,一篇文章把变量的底裤扒干净(附实战踩坑全记录)
目录
- 一、变量到底是什么
- 二、变量的三要素
- 三、命名规则与 PEP 8 规范
- 四、引用模型:id() 与 is
- 五、可变对象 vs 不可变对象
- 六、多变量赋值与解包
- 七、全局变量与局部变量
- 八、数字缓存与字符串驻留
- 九、type() 与动态类型
- 十、深拷贝与浅拷贝
- 十一、实战:6 个经典踩坑
- 十二、总结
一、变量到底是什么
先看一段最简单的代码:
a = 5
b = a
b = 10
print(a) # 输出 5 — 而不是 10
如果你以前学过 C / Java,可能会惊讶:b 不是"等于"a 吗?为什么改了 b,a 没变?
因为 Python 的变量跟它们有本质区别:
#mermaid-svg-Kjouw5dYT4tcFKzk{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Kjouw5dYT4tcFKzk .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Kjouw5dYT4tcFKzk .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Kjouw5dYT4tcFKzk .error-icon{fill:#552222;}#mermaid-svg-Kjouw5dYT4tcFKzk .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Kjouw5dYT4tcFKzk .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Kjouw5dYT4tcFKzk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Kjouw5dYT4tcFKzk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Kjouw5dYT4tcFKzk .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Kjouw5dYT4tcFKzk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Kjouw5dYT4tcFKzk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Kjouw5dYT4tcFKzk .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Kjouw5dYT4tcFKzk .marker.cross{stroke:#333333;}#mermaid-svg-Kjouw5dYT4tcFKzk svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Kjouw5dYT4tcFKzk p{margin:0;}#mermaid-svg-Kjouw5dYT4tcFKzk .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-Kjouw5dYT4tcFKzk .cluster-label text{fill:#333;}#mermaid-svg-Kjouw5dYT4tcFKzk .cluster-label span{color:#333;}#mermaid-svg-Kjouw5dYT4tcFKzk .cluster-label span p{background-color:transparent;}#mermaid-svg-Kjouw5dYT4tcFKzk .label text,#mermaid-svg-Kjouw5dYT4tcFKzk span{fill:#333;color:#333;}#mermaid-svg-Kjouw5dYT4tcFKzk .node rect,#mermaid-svg-Kjouw5dYT4tcFKzk .node circle,#mermaid-svg-Kjouw5dYT4tcFKzk .node ellipse,#mermaid-svg-Kjouw5dYT4tcFKzk .node polygon,#mermaid-svg-Kjouw5dYT4tcFKzk .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Kjouw5dYT4tcFKzk .rough-node .label text,#mermaid-svg-Kjouw5dYT4tcFKzk .node .label text,#mermaid-svg-Kjouw5dYT4tcFKzk .image-shape .label,#mermaid-svg-Kjouw5dYT4tcFKzk .icon-shape .label{text-anchor:middle;}#mermaid-svg-Kjouw5dYT4tcFKzk .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Kjouw5dYT4tcFKzk .rough-node .label,#mermaid-svg-Kjouw5dYT4tcFKzk .node .label,#mermaid-svg-Kjouw5dYT4tcFKzk .image-shape .label,#mermaid-svg-Kjouw5dYT4tcFKzk .icon-shape .label{text-align:center;}#mermaid-svg-Kjouw5dYT4tcFKzk .node.clickable{cursor:pointer;}#mermaid-svg-Kjouw5dYT4tcFKzk .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Kjouw5dYT4tcFKzk .arrowheadPath{fill:#333333;}#mermaid-svg-Kjouw5dYT4tcFKzk .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Kjouw5dYT4tcFKzk .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Kjouw5dYT4tcFKzk .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Kjouw5dYT4tcFKzk .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Kjouw5dYT4tcFKzk .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Kjouw5dYT4tcFKzk .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Kjouw5dYT4tcFKzk .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Kjouw5dYT4tcFKzk .cluster text{fill:#333;}#mermaid-svg-Kjouw5dYT4tcFKzk .cluster span{color:#333;}#mermaid-svg-Kjouw5dYT4tcFKzk div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Kjouw5dYT4tcFKzk .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Kjouw5dYT4tcFKzk rect.text{fill:none;stroke-width:0;}#mermaid-svg-Kjouw5dYT4tcFKzk .icon-shape,#mermaid-svg-Kjouw5dYT4tcFKzk .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Kjouw5dYT4tcFKzk .icon-shape p,#mermaid-svg-Kjouw5dYT4tcFKzk .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Kjouw5dYT4tcFKzk .icon-shape .label rect,#mermaid-svg-Kjouw5dYT4tcFKzk .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Kjouw5dYT4tcFKzk .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Kjouw5dYT4tcFKzk .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Kjouw5dYT4tcFKzk :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Python: 标签模型
a = 5
创建 int 对象 5a 是一个标签贴在 5 上
b = a
b 也贴在同一个 5 上
b = 10
b 撕下来贴到新对象 10a 还在 5 上
C / Java: 盒子模型
int a = 5;
给 a 分配一块内存里面放 5
a = 10;
把盒子里的 5 换成 10
核心区别一览:
| 变量的本质 | 存放数据的盒子 | 指向对象的标签 |
| b = a 后改 b | 看情况(指针 / 值拷贝) | a 不受影响 |
| 内存管理 | 手动或 GC | 引用计数 + GC |
一句话:Python 变量不是容器,是指针——只不过不用你自己管内存。
二、变量的三要素
从参考代码 2.2变量.py 的三要素说起:
# 声明变量
name = "lisi"
age = 18
hobby = "打球"
# 使用变量 — 通过变量名获取变量值
print("个人信息:", name, age, hobby)
# 变量的三要素:变量名,变量值,变量数据类型
#mermaid-svg-t4EMby7ZDdNz2Msj{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-t4EMby7ZDdNz2Msj .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-t4EMby7ZDdNz2Msj .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-t4EMby7ZDdNz2Msj .error-icon{fill:#552222;}#mermaid-svg-t4EMby7ZDdNz2Msj .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-t4EMby7ZDdNz2Msj .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-t4EMby7ZDdNz2Msj .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-t4EMby7ZDdNz2Msj .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-t4EMby7ZDdNz2Msj .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-t4EMby7ZDdNz2Msj .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-t4EMby7ZDdNz2Msj .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-t4EMby7ZDdNz2Msj .marker{fill:#333333;stroke:#333333;}#mermaid-svg-t4EMby7ZDdNz2Msj .marker.cross{stroke:#333333;}#mermaid-svg-t4EMby7ZDdNz2Msj svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-t4EMby7ZDdNz2Msj p{margin:0;}#mermaid-svg-t4EMby7ZDdNz2Msj .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-t4EMby7ZDdNz2Msj .cluster-label text{fill:#333;}#mermaid-svg-t4EMby7ZDdNz2Msj .cluster-label span{color:#333;}#mermaid-svg-t4EMby7ZDdNz2Msj .cluster-label span p{background-color:transparent;}#mermaid-svg-t4EMby7ZDdNz2Msj .label text,#mermaid-svg-t4EMby7ZDdNz2Msj span{fill:#333;color:#333;}#mermaid-svg-t4EMby7ZDdNz2Msj .node rect,#mermaid-svg-t4EMby7ZDdNz2Msj .node circle,#mermaid-svg-t4EMby7ZDdNz2Msj .node ellipse,#mermaid-svg-t4EMby7ZDdNz2Msj .node polygon,#mermaid-svg-t4EMby7ZDdNz2Msj .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-t4EMby7ZDdNz2Msj .rough-node .label text,#mermaid-svg-t4EMby7ZDdNz2Msj .node .label text,#mermaid-svg-t4EMby7ZDdNz2Msj .image-shape .label,#mermaid-svg-t4EMby7ZDdNz2Msj .icon-shape .label{text-anchor:middle;}#mermaid-svg-t4EMby7ZDdNz2Msj .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-t4EMby7ZDdNz2Msj .rough-node .label,#mermaid-svg-t4EMby7ZDdNz2Msj .node .label,#mermaid-svg-t4EMby7ZDdNz2Msj .image-shape .label,#mermaid-svg-t4EMby7ZDdNz2Msj .icon-shape .label{text-align:center;}#mermaid-svg-t4EMby7ZDdNz2Msj .node.clickable{cursor:pointer;}#mermaid-svg-t4EMby7ZDdNz2Msj .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-t4EMby7ZDdNz2Msj .arrowheadPath{fill:#333333;}#mermaid-svg-t4EMby7ZDdNz2Msj .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-t4EMby7ZDdNz2Msj .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-t4EMby7ZDdNz2Msj .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-t4EMby7ZDdNz2Msj .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-t4EMby7ZDdNz2Msj .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-t4EMby7ZDdNz2Msj .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-t4EMby7ZDdNz2Msj .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-t4EMby7ZDdNz2Msj .cluster text{fill:#333;}#mermaid-svg-t4EMby7ZDdNz2Msj .cluster span{color:#333;}#mermaid-svg-t4EMby7ZDdNz2Msj div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-t4EMby7ZDdNz2Msj .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-t4EMby7ZDdNz2Msj rect.text{fill:none;stroke-width:0;}#mermaid-svg-t4EMby7ZDdNz2Msj .icon-shape,#mermaid-svg-t4EMby7ZDdNz2Msj .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-t4EMby7ZDdNz2Msj .icon-shape p,#mermaid-svg-t4EMby7ZDdNz2Msj .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-t4EMby7ZDdNz2Msj .icon-shape .label rect,#mermaid-svg-t4EMby7ZDdNz2Msj .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-t4EMby7ZDdNz2Msj .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-t4EMby7ZDdNz2Msj .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-t4EMby7ZDdNz2Msj :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
变量 age = 18
变量名: age
变量值: 18
数据类型: int
| 变量名 | 你给它起的名字 | age |
| 变量值 | 它指向的对象 | 18 (int 对象) |
| 数据类型 | 指向的对象是什么类型 | int |
三、命名规则与 PEP 8 规范
硬性规则(违反直接报错):
| 只能字母 / 数字 / 下划线 | user_name | user-name |
| 不能数字开头 | name2 | 2name |
| 不能是保留字 | class_ | class |
| 区分大小写 | age 和 Age 是两个变量 | – |
约定俗成(PEP 8,不遵守也能跑但会被鄙视):
# 变量和函数:小写 + 下划线
user_name = "zhangsan"
total_count = 100
# 类名:大驼峰
class ShoppingCart:
pass
# 常量:全大写 + 下划线
MAX_CONNECTIONS = 100
DATABASE_URL = "localhost"
# 私有变量:单下划线前缀
_internal_cache = {}
# 避免的名字
l = 1 # 像数字 1
O = 1 # 像数字 0
I = 1 # i 的大写像 1
四、引用模型:id() 与 is
Python 每个对象都有唯一身份证号 —— id() 返回对象的内存地址:
a = 5
b = 5
print(id(a)) # 输出同一个内存地址
print(id(b)) # 同上
print(a is b) # True — a 和 b 指向同一个对象
print(a == b) # True — 值相等
# 但大整数就不同了
a = 500
b = 500
print(a is b) # False — 两个不同的 500 对象
print(a == b) # True — 值还是相等
== vs is 一句话区分:
| == | 两个对象的值相等吗? |
| is | 两个变量指向同一个对象吗? |
is 一般只用在跟 None 比较时:if x is None。
五、可变对象 vs 不可变对象
Python 的数据类型分为两派,这个划分直接影响变量的行为:
| 不可变 | int / float / str / bool / tuple | 对象创建后不能修改 |
| 可变 | list / dict / set | 对象创建后可以原地修改 |
不可变变量 —— 改了就是指向新对象:
a = "hello"
b = a
a = a + " world" # 创建了新字符串对象
print(a) # hello world
print(b) # hello — b 不受影响
可变变量 —— 改的是同一个对象,所有引用都受影响:
a = [1, 2, 3]
b = a # b 也贴在同一个 list 上
a.append(4)
print(a) # [1, 2, 3, 4]
print(b) # [1, 2, 3, 4] — b 也跟着变了
#mermaid-svg-WBgnqWwFKcngo7Tg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-WBgnqWwFKcngo7Tg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-WBgnqWwFKcngo7Tg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-WBgnqWwFKcngo7Tg .error-icon{fill:#552222;}#mermaid-svg-WBgnqWwFKcngo7Tg .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WBgnqWwFKcngo7Tg .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-WBgnqWwFKcngo7Tg .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WBgnqWwFKcngo7Tg .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WBgnqWwFKcngo7Tg .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-WBgnqWwFKcngo7Tg .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WBgnqWwFKcngo7Tg .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WBgnqWwFKcngo7Tg .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WBgnqWwFKcngo7Tg .marker.cross{stroke:#333333;}#mermaid-svg-WBgnqWwFKcngo7Tg svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WBgnqWwFKcngo7Tg p{margin:0;}#mermaid-svg-WBgnqWwFKcngo7Tg .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-WBgnqWwFKcngo7Tg .cluster-label text{fill:#333;}#mermaid-svg-WBgnqWwFKcngo7Tg .cluster-label span{color:#333;}#mermaid-svg-WBgnqWwFKcngo7Tg .cluster-label span p{background-color:transparent;}#mermaid-svg-WBgnqWwFKcngo7Tg .label text,#mermaid-svg-WBgnqWwFKcngo7Tg span{fill:#333;color:#333;}#mermaid-svg-WBgnqWwFKcngo7Tg .node rect,#mermaid-svg-WBgnqWwFKcngo7Tg .node circle,#mermaid-svg-WBgnqWwFKcngo7Tg .node ellipse,#mermaid-svg-WBgnqWwFKcngo7Tg .node polygon,#mermaid-svg-WBgnqWwFKcngo7Tg .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WBgnqWwFKcngo7Tg .rough-node .label text,#mermaid-svg-WBgnqWwFKcngo7Tg .node .label text,#mermaid-svg-WBgnqWwFKcngo7Tg .image-shape .label,#mermaid-svg-WBgnqWwFKcngo7Tg .icon-shape .label{text-anchor:middle;}#mermaid-svg-WBgnqWwFKcngo7Tg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-WBgnqWwFKcngo7Tg .rough-node .label,#mermaid-svg-WBgnqWwFKcngo7Tg .node .label,#mermaid-svg-WBgnqWwFKcngo7Tg .image-shape .label,#mermaid-svg-WBgnqWwFKcngo7Tg .icon-shape .label{text-align:center;}#mermaid-svg-WBgnqWwFKcngo7Tg .node.clickable{cursor:pointer;}#mermaid-svg-WBgnqWwFKcngo7Tg .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-WBgnqWwFKcngo7Tg .arrowheadPath{fill:#333333;}#mermaid-svg-WBgnqWwFKcngo7Tg .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-WBgnqWwFKcngo7Tg .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-WBgnqWwFKcngo7Tg .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WBgnqWwFKcngo7Tg .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-WBgnqWwFKcngo7Tg .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WBgnqWwFKcngo7Tg .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-WBgnqWwFKcngo7Tg .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-WBgnqWwFKcngo7Tg .cluster text{fill:#333;}#mermaid-svg-WBgnqWwFKcngo7Tg .cluster span{color:#333;}#mermaid-svg-WBgnqWwFKcngo7Tg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-WBgnqWwFKcngo7Tg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-WBgnqWwFKcngo7Tg rect.text{fill:none;stroke-width:0;}#mermaid-svg-WBgnqWwFKcngo7Tg .icon-shape,#mermaid-svg-WBgnqWwFKcngo7Tg .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WBgnqWwFKcngo7Tg .icon-shape p,#mermaid-svg-WBgnqWwFKcngo7Tg .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-WBgnqWwFKcngo7Tg .icon-shape .label rect,#mermaid-svg-WBgnqWwFKcngo7Tg .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WBgnqWwFKcngo7Tg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-WBgnqWwFKcngo7Tg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-WBgnqWwFKcngo7Tg :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
可变对象 list
a = [1, 2, 3]
对象 [1, 2, 3]
b = a
a.append(4)
对象变成 [1, 2, 3, 4]b 也看到了变化
不可变对象 str
a = 'hello'
对象 'hello'
b = a
a = a + ' world'
新对象 'hello world'
b 仍旧指向 'hello'
函数传参也是一样的规律:
# 不可变参数 — 函数里改不了外面
def add_one(x):
x = x + 1
return x
a = 5
add_one(a)
print(a) # 5 — a 没变
# 可变参数 — 函数里改了外面也跟着变
def append_item(lst):
lst.append(4)
my_list = [1, 2, 3]
append_item(my_list)
print(my_list) # [1, 2, 3, 4] — 变了
六、多变量赋值与解包
# 一行声明多个变量
a, b, c = 1, 2, 3
# 交换变量 — 不用临时变量
a, b = b, a
# 解包 list 或 tuple
data = ("zhangsan", 18, "male")
name, age, gender = data
print(name, age, gender) # zhangsan 18 male
# 用 * 吃掉不关心的部分
first, *rest = [1, 2, 3, 4, 5]
print(first) # 1
print(rest) # [2, 3, 4, 5]
七、全局变量与局部变量
LEGB 查找顺序:
#mermaid-svg-sPHQpI3PfbcEMlSo{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-sPHQpI3PfbcEMlSo .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-sPHQpI3PfbcEMlSo .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-sPHQpI3PfbcEMlSo .error-icon{fill:#552222;}#mermaid-svg-sPHQpI3PfbcEMlSo .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-sPHQpI3PfbcEMlSo .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-sPHQpI3PfbcEMlSo .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-sPHQpI3PfbcEMlSo .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-sPHQpI3PfbcEMlSo .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-sPHQpI3PfbcEMlSo .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-sPHQpI3PfbcEMlSo .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-sPHQpI3PfbcEMlSo .marker{fill:#333333;stroke:#333333;}#mermaid-svg-sPHQpI3PfbcEMlSo .marker.cross{stroke:#333333;}#mermaid-svg-sPHQpI3PfbcEMlSo svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-sPHQpI3PfbcEMlSo p{margin:0;}#mermaid-svg-sPHQpI3PfbcEMlSo .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-sPHQpI3PfbcEMlSo .cluster-label text{fill:#333;}#mermaid-svg-sPHQpI3PfbcEMlSo .cluster-label span{color:#333;}#mermaid-svg-sPHQpI3PfbcEMlSo .cluster-label span p{background-color:transparent;}#mermaid-svg-sPHQpI3PfbcEMlSo .label text,#mermaid-svg-sPHQpI3PfbcEMlSo span{fill:#333;color:#333;}#mermaid-svg-sPHQpI3PfbcEMlSo .node rect,#mermaid-svg-sPHQpI3PfbcEMlSo .node circle,#mermaid-svg-sPHQpI3PfbcEMlSo .node ellipse,#mermaid-svg-sPHQpI3PfbcEMlSo .node polygon,#mermaid-svg-sPHQpI3PfbcEMlSo .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-sPHQpI3PfbcEMlSo .rough-node .label text,#mermaid-svg-sPHQpI3PfbcEMlSo .node .label text,#mermaid-svg-sPHQpI3PfbcEMlSo .image-shape .label,#mermaid-svg-sPHQpI3PfbcEMlSo .icon-shape .label{text-anchor:middle;}#mermaid-svg-sPHQpI3PfbcEMlSo .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-sPHQpI3PfbcEMlSo .rough-node .label,#mermaid-svg-sPHQpI3PfbcEMlSo .node .label,#mermaid-svg-sPHQpI3PfbcEMlSo .image-shape .label,#mermaid-svg-sPHQpI3PfbcEMlSo .icon-shape .label{text-align:center;}#mermaid-svg-sPHQpI3PfbcEMlSo .node.clickable{cursor:pointer;}#mermaid-svg-sPHQpI3PfbcEMlSo .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-sPHQpI3PfbcEMlSo .arrowheadPath{fill:#333333;}#mermaid-svg-sPHQpI3PfbcEMlSo .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-sPHQpI3PfbcEMlSo .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-sPHQpI3PfbcEMlSo .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sPHQpI3PfbcEMlSo .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-sPHQpI3PfbcEMlSo .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sPHQpI3PfbcEMlSo .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-sPHQpI3PfbcEMlSo .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-sPHQpI3PfbcEMlSo .cluster text{fill:#333;}#mermaid-svg-sPHQpI3PfbcEMlSo .cluster span{color:#333;}#mermaid-svg-sPHQpI3PfbcEMlSo div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-sPHQpI3PfbcEMlSo .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-sPHQpI3PfbcEMlSo rect.text{fill:none;stroke-width:0;}#mermaid-svg-sPHQpI3PfbcEMlSo .icon-shape,#mermaid-svg-sPHQpI3PfbcEMlSo .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sPHQpI3PfbcEMlSo .icon-shape p,#mermaid-svg-sPHQpI3PfbcEMlSo .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-sPHQpI3PfbcEMlSo .icon-shape .label rect,#mermaid-svg-sPHQpI3PfbcEMlSo .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sPHQpI3PfbcEMlSo .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-sPHQpI3PfbcEMlSo .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-sPHQpI3PfbcEMlSo :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
查找变量时按顺序
Local函数内部
Enclosing外层嵌套函数
Global模块级别
Built-inPython 内置
代码演示:
x = "global"
def test():
x = "local"
print(x) # local
test()
print(x) # global
def modify_global():
global x
x = "changed"
modify_global()
print(x) # changed
| global | 在函数内声明使用全局变量 |
| nonlocal | 在嵌套函数内声明使用外层函数的变量 |
八、数字缓存与字符串驻留
为什么小整数 is 有时返回 True,有时 False?
a = 5
b = 5
print(a is b) # True — 5 在缓存池里
a = 500
b = 500
print(a is b) # False — 500 不在缓存池里
原因:Python 启动时把 [-5, 256] 之间的小整数全部创建好放在常量池里。 这些范围内的赋值不会创建新对象,全部复用池子里的。
同样的机制也存在于短字符串(intern 机制):
a = "hello"
b = "hello"
print(a is b) # True — 短字符串被 intern 了
#mermaid-svg-vLNRXKyikk6pfKdO{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-vLNRXKyikk6pfKdO .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-vLNRXKyikk6pfKdO .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-vLNRXKyikk6pfKdO .error-icon{fill:#552222;}#mermaid-svg-vLNRXKyikk6pfKdO .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-vLNRXKyikk6pfKdO .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-vLNRXKyikk6pfKdO .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-vLNRXKyikk6pfKdO .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-vLNRXKyikk6pfKdO .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-vLNRXKyikk6pfKdO .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-vLNRXKyikk6pfKdO .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-vLNRXKyikk6pfKdO .marker{fill:#333333;stroke:#333333;}#mermaid-svg-vLNRXKyikk6pfKdO .marker.cross{stroke:#333333;}#mermaid-svg-vLNRXKyikk6pfKdO svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-vLNRXKyikk6pfKdO p{margin:0;}#mermaid-svg-vLNRXKyikk6pfKdO .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-vLNRXKyikk6pfKdO .cluster-label text{fill:#333;}#mermaid-svg-vLNRXKyikk6pfKdO .cluster-label span{color:#333;}#mermaid-svg-vLNRXKyikk6pfKdO .cluster-label span p{background-color:transparent;}#mermaid-svg-vLNRXKyikk6pfKdO .label text,#mermaid-svg-vLNRXKyikk6pfKdO span{fill:#333;color:#333;}#mermaid-svg-vLNRXKyikk6pfKdO .node rect,#mermaid-svg-vLNRXKyikk6pfKdO .node circle,#mermaid-svg-vLNRXKyikk6pfKdO .node ellipse,#mermaid-svg-vLNRXKyikk6pfKdO .node polygon,#mermaid-svg-vLNRXKyikk6pfKdO .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-vLNRXKyikk6pfKdO .rough-node .label text,#mermaid-svg-vLNRXKyikk6pfKdO .node .label text,#mermaid-svg-vLNRXKyikk6pfKdO .image-shape .label,#mermaid-svg-vLNRXKyikk6pfKdO .icon-shape .label{text-anchor:middle;}#mermaid-svg-vLNRXKyikk6pfKdO .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-vLNRXKyikk6pfKdO .rough-node .label,#mermaid-svg-vLNRXKyikk6pfKdO .node .label,#mermaid-svg-vLNRXKyikk6pfKdO .image-shape .label,#mermaid-svg-vLNRXKyikk6pfKdO .icon-shape .label{text-align:center;}#mermaid-svg-vLNRXKyikk6pfKdO .node.clickable{cursor:pointer;}#mermaid-svg-vLNRXKyikk6pfKdO .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-vLNRXKyikk6pfKdO .arrowheadPath{fill:#333333;}#mermaid-svg-vLNRXKyikk6pfKdO .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-vLNRXKyikk6pfKdO .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-vLNRXKyikk6pfKdO .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vLNRXKyikk6pfKdO .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-vLNRXKyikk6pfKdO .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vLNRXKyikk6pfKdO .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-vLNRXKyikk6pfKdO .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-vLNRXKyikk6pfKdO .cluster text{fill:#333;}#mermaid-svg-vLNRXKyikk6pfKdO .cluster span{color:#333;}#mermaid-svg-vLNRXKyikk6pfKdO div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-vLNRXKyikk6pfKdO .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-vLNRXKyikk6pfKdO rect.text{fill:none;stroke-width:0;}#mermaid-svg-vLNRXKyikk6pfKdO .icon-shape,#mermaid-svg-vLNRXKyikk6pfKdO .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vLNRXKyikk6pfKdO .icon-shape p,#mermaid-svg-vLNRXKyikk6pfKdO .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-vLNRXKyikk6pfKdO .icon-shape .label rect,#mermaid-svg-vLNRXKyikk6pfKdO .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vLNRXKyikk6pfKdO .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-vLNRXKyikk6pfKdO .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-vLNRXKyikk6pfKdO :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
a = 5
整数常量池[-5, 256]5 已经在里面了
b = 5
a = 500
新对象 500
b = 500
新对象 500 (另一个)
结论:不要用 is 判断数值是否相等,用 ==。
九、type() 与动态类型
Python 是动态类型语言 —— 变量可以随时指向不同类型的对象:
x = 5
print(type(x)) # int
x = "hello"
print(type(x)) # str
x = [1, 2, 3]
print(type(x)) # list
对比静态语言(Java 里 int x = 5 之后 x 永远是 int),Python 的灵活性就体现出来了。
十、深拷贝与浅拷贝
对于嵌套的可变对象,直接用 = 是贴标签,用 .copy() 只拷贝第一层:
import copy
original = [1, 2, [3, 4]]
# 直接赋值 — 同一个对象
ref = original
ref[0] = 99
print(original) # [99, 2, [3, 4]] — 跟着变了
# 浅拷贝 — 第一层独立,嵌套层共享
shallow = original.copy()
shallow[0] = 100 # 第一层不影响 original
shallow[2].append(5) # 嵌套层共享 — 都变了
print(original) # [99, 2, [3, 4, 5]]
# 深拷贝 — 完全独立
deep = copy.deepcopy(original)
deep[2].append(6)
print(original) # [99, 2, [3, 4, 5]] — 不受影响
#mermaid-svg-DrGEtZawehojLjLV{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-DrGEtZawehojLjLV .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DrGEtZawehojLjLV .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DrGEtZawehojLjLV .error-icon{fill:#552222;}#mermaid-svg-DrGEtZawehojLjLV .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DrGEtZawehojLjLV .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DrGEtZawehojLjLV .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DrGEtZawehojLjLV .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DrGEtZawehojLjLV .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DrGEtZawehojLjLV .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DrGEtZawehojLjLV .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DrGEtZawehojLjLV .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DrGEtZawehojLjLV .marker.cross{stroke:#333333;}#mermaid-svg-DrGEtZawehojLjLV svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DrGEtZawehojLjLV p{margin:0;}#mermaid-svg-DrGEtZawehojLjLV .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-DrGEtZawehojLjLV .cluster-label text{fill:#333;}#mermaid-svg-DrGEtZawehojLjLV .cluster-label span{color:#333;}#mermaid-svg-DrGEtZawehojLjLV .cluster-label span p{background-color:transparent;}#mermaid-svg-DrGEtZawehojLjLV .label text,#mermaid-svg-DrGEtZawehojLjLV span{fill:#333;color:#333;}#mermaid-svg-DrGEtZawehojLjLV .node rect,#mermaid-svg-DrGEtZawehojLjLV .node circle,#mermaid-svg-DrGEtZawehojLjLV .node ellipse,#mermaid-svg-DrGEtZawehojLjLV .node polygon,#mermaid-svg-DrGEtZawehojLjLV .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DrGEtZawehojLjLV .rough-node .label text,#mermaid-svg-DrGEtZawehojLjLV .node .label text,#mermaid-svg-DrGEtZawehojLjLV .image-shape .label,#mermaid-svg-DrGEtZawehojLjLV .icon-shape .label{text-anchor:middle;}#mermaid-svg-DrGEtZawehojLjLV .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-DrGEtZawehojLjLV .rough-node .label,#mermaid-svg-DrGEtZawehojLjLV .node .label,#mermaid-svg-DrGEtZawehojLjLV .image-shape .label,#mermaid-svg-DrGEtZawehojLjLV .icon-shape .label{text-align:center;}#mermaid-svg-DrGEtZawehojLjLV .node.clickable{cursor:pointer;}#mermaid-svg-DrGEtZawehojLjLV .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-DrGEtZawehojLjLV .arrowheadPath{fill:#333333;}#mermaid-svg-DrGEtZawehojLjLV .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DrGEtZawehojLjLV .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DrGEtZawehojLjLV .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DrGEtZawehojLjLV .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-DrGEtZawehojLjLV .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DrGEtZawehojLjLV .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-DrGEtZawehojLjLV .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DrGEtZawehojLjLV .cluster text{fill:#333;}#mermaid-svg-DrGEtZawehojLjLV .cluster span{color:#333;}#mermaid-svg-DrGEtZawehojLjLV div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DrGEtZawehojLjLV .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-DrGEtZawehojLjLV rect.text{fill:none;stroke-width:0;}#mermaid-svg-DrGEtZawehojLjLV .icon-shape,#mermaid-svg-DrGEtZawehojLjLV .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DrGEtZawehojLjLV .icon-shape p,#mermaid-svg-DrGEtZawehojLjLV .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-DrGEtZawehojLjLV .icon-shape .label rect,#mermaid-svg-DrGEtZawehojLjLV .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DrGEtZawehojLjLV .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-DrGEtZawehojLjLV .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-DrGEtZawehojLjLV :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
original 指向
list […, …, [3,4]]
shallow 指向
list […, …, 指向嵌套层]
deep 指向
list […, …, 全新嵌套层]
嵌套 list [3,4]和 original 共享!
嵌套 list [3,4]完全独立
十一、实战:6 个经典踩坑
坑 1:函数默认参数只初始化一次
def add_item(item, lst=[]):
lst.append(item)
return lst
print(add_item(1)) # [1]
print(add_item(2)) # [1, 2] — 同一个 list
修正:
def add_item(item, lst=None):
if lst is None:
lst = []
lst.append(item)
return lst
坑 2:用 is 比较数值
a = 1000
b = 1000
print(a is b) # False — 别用 is 比数值
print(a == b) # True — 用 ==
坑 3:+= 和 = x + 不一样
# 对可变对象,+= 是原地修改
a = [1, 2]
b = a
a += [3] # 原地修改,b 也变了
print(a, b) # [1, 2, 3] [1, 2, 3]
# 但 = a + [3] 创建了新对象
a = [1, 2]
b = a
a = a + [3] # 新对象,b 不变
print(a, b) # [1, 2, 3] [1, 2]
坑 4:列表乘法引用同一个子对象
grid = [[0] * 3] * 3
grid[0][0] = 99
print(grid)
# [[99, 0, 0], [99, 0, 0], [99, 0, 0]]
# 三行全变了 — 因为 * 是浅拷贝,三个子列表是同一个对象
坑 5:循环变量泄漏
for i in range(3):
pass
print(i) # 2 — 循环后 i 还能用,这是 Python 的特性
坑 6:覆盖内置函数名
list = [1, 2, 3] # 覆盖了内置 list
new = list("hello") # TypeError: list is not callable
# 修复
del list # 恢复内置 list
十二、总结
Python 变量模型全景图:
#mermaid-svg-HvBEEBVCiAEFyJVq{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-HvBEEBVCiAEFyJVq .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-HvBEEBVCiAEFyJVq .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-HvBEEBVCiAEFyJVq .error-icon{fill:#552222;}#mermaid-svg-HvBEEBVCiAEFyJVq .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-HvBEEBVCiAEFyJVq .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-HvBEEBVCiAEFyJVq .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-HvBEEBVCiAEFyJVq .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-HvBEEBVCiAEFyJVq .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-HvBEEBVCiAEFyJVq .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-HvBEEBVCiAEFyJVq .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-HvBEEBVCiAEFyJVq .marker{fill:#333333;stroke:#333333;}#mermaid-svg-HvBEEBVCiAEFyJVq .marker.cross{stroke:#333333;}#mermaid-svg-HvBEEBVCiAEFyJVq svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-HvBEEBVCiAEFyJVq p{margin:0;}#mermaid-svg-HvBEEBVCiAEFyJVq .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-HvBEEBVCiAEFyJVq .cluster-label text{fill:#333;}#mermaid-svg-HvBEEBVCiAEFyJVq .cluster-label span{color:#333;}#mermaid-svg-HvBEEBVCiAEFyJVq .cluster-label span p{background-color:transparent;}#mermaid-svg-HvBEEBVCiAEFyJVq .label text,#mermaid-svg-HvBEEBVCiAEFyJVq span{fill:#333;color:#333;}#mermaid-svg-HvBEEBVCiAEFyJVq .node rect,#mermaid-svg-HvBEEBVCiAEFyJVq .node circle,#mermaid-svg-HvBEEBVCiAEFyJVq .node ellipse,#mermaid-svg-HvBEEBVCiAEFyJVq .node polygon,#mermaid-svg-HvBEEBVCiAEFyJVq .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-HvBEEBVCiAEFyJVq .rough-node .label text,#mermaid-svg-HvBEEBVCiAEFyJVq .node .label text,#mermaid-svg-HvBEEBVCiAEFyJVq .image-shape .label,#mermaid-svg-HvBEEBVCiAEFyJVq .icon-shape .label{text-anchor:middle;}#mermaid-svg-HvBEEBVCiAEFyJVq .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-HvBEEBVCiAEFyJVq .rough-node .label,#mermaid-svg-HvBEEBVCiAEFyJVq .node .label,#mermaid-svg-HvBEEBVCiAEFyJVq .image-shape .label,#mermaid-svg-HvBEEBVCiAEFyJVq .icon-shape .label{text-align:center;}#mermaid-svg-HvBEEBVCiAEFyJVq .node.clickable{cursor:pointer;}#mermaid-svg-HvBEEBVCiAEFyJVq .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-HvBEEBVCiAEFyJVq .arrowheadPath{fill:#333333;}#mermaid-svg-HvBEEBVCiAEFyJVq .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-HvBEEBVCiAEFyJVq .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-HvBEEBVCiAEFyJVq .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-HvBEEBVCiAEFyJVq .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-HvBEEBVCiAEFyJVq .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-HvBEEBVCiAEFyJVq .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-HvBEEBVCiAEFyJVq .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-HvBEEBVCiAEFyJVq .cluster text{fill:#333;}#mermaid-svg-HvBEEBVCiAEFyJVq .cluster span{color:#333;}#mermaid-svg-HvBEEBVCiAEFyJVq div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-HvBEEBVCiAEFyJVq .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-HvBEEBVCiAEFyJVq rect.text{fill:none;stroke-width:0;}#mermaid-svg-HvBEEBVCiAEFyJVq .icon-shape,#mermaid-svg-HvBEEBVCiAEFyJVq .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-HvBEEBVCiAEFyJVq .icon-shape p,#mermaid-svg-HvBEEBVCiAEFyJVq .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-HvBEEBVCiAEFyJVq .icon-shape .label rect,#mermaid-svg-HvBEEBVCiAEFyJVq .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-HvBEEBVCiAEFyJVq .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-HvBEEBVCiAEFyJVq .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-HvBEEBVCiAEFyJVq :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
不可变
可变
变量 = 标签
贴在对象上
对象类型?
改 = 换新对象int / str / tuple
改 = 原地修改list / dict / set
赋值不影响其他标签
所有标签都看到变化
核心速查:
| 变量本质 | 标签,不是盒子 |
| == vs is | 比值 vs 比对象 |
| 可变 / 不可变 | 决定赋值行为 |
| 默认参数 | 只初始化一次,别用可变对象做默认值 |
| 深拷贝 / 浅拷贝 | 嵌套对象才需要区分 |
| 小整数缓存 | [-5, 256],别用 is 比数值 |
| type() | 看变量指向对象的类型 |
一句话总结: Python 变量是贴在对象上的标签。理解这一点,赋值、传参、拷贝、可变不可变对象的行为就全部串起来了。


