欢迎光临
我们一直在努力

Python 变量真这么简单?从标签模型到内存引用,从可变对象到作用域,一篇文章把变量的底裤扒干净(附实战踩坑全记录)

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

核心区别一览:

C / JavaPython
变量的本质 存放数据的盒子 指向对象的标签
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 变量是贴在对象上的标签。理解这一点,赋值、传参、拷贝、可变不可变对象的行为就全部串起来了。

赞(0)
未经允许不得转载:171主机测评 » Python 变量真这么简单?从标签模型到内存引用,从可变对象到作用域,一篇文章把变量的底裤扒干净(附实战踩坑全记录)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址