第 01 讲:Python 变量、对象、数据类型与内存引用

我们将列出相关的学习目标,并且对之前的python0基础学习,进行简单的回顾

整体按 Python 3 的主流行为组织,采用高信息密度、逐章递进的方式。每一讲都包含概念原理、关键源码、运行结果、常见陷阱,以及 1~3 道编程题和完整标准答案。

课程不会只停留在语法表面,还会逐步深入对象模型、内存管理、函数调用机制、装饰器、迭代器、生成器、多线程、异步编程等重点。

Python 核心知识体系

阶段 章节 核心内容
基础篇 01--04 变量与对象、数据类型、运算符、字符串与类型转换
容器篇 05--09 list、tuple、dict、set、切片、推导式、哈希机制
函数篇 10--14 参数传递、可变参数、作用域、LEGB、闭包、lambda
进阶篇 15--19 装饰器、迭代器、生成器、yield、上下文管理器
面向对象篇 20--25 类与实例、继承、多态、MRO、super、魔术方法
内存机制篇 26--29 引用计数、垃圾回收、深浅拷贝、可变对象、生命周期
并发篇 30--34 进程、线程、GIL、锁、线程池、asyncio、协程
工程篇 35--39 模块与包、异常、文件、JSON、类型注解、测试
高阶篇 40--44 描述符、元类、数据模型、性能优化、常用设计模式
综合篇 45+ 高频代码分析、算法实现、工程编程与综合问题

章节编号是初始规划,必要时会拆分专题,确保重要知识不被省略。

第 01 讲:Python 变量、对象、数据类型与内存引用

一、Python 变量的本质

先看代码:

复制代码
a = 10b = aa = 20print(a)print(b)

运行结果:

复制代码
20
10

为什么修改 a 没有影响 b?

因为 Python 变量更准确地说是绑定到对象的名称,而不是直接存放数据的固定内存盒子。

最初:

复制代码
a ─────┐
       ├────> 整数对象 10
b ─────┘

执行 a = 20 后:

复制代码
a ──────────> 整数对象 20

b ──────────> 整数对象 10

这里发生的是 a 重新绑定,而不是把整数对象 10 修改成 20。

这是理解后续函数传参、列表修改、深浅拷贝和内存管理的基础。

二、Python 的六种常见内置类型

类型 示例 可变性 作用
int 10 不可变 整数
float 3.14 不可变 浮点数
bool True 不可变 布尔值
str "robot" 不可变 字符串
list [1, 2, 3] 可变 列表
dict {"x": 10} 可变 字典

另外,tuple(元组)、set(集合)、NoneType 也非常重要,后续会分别展开。

Python 具有两个基本特性:

动态类型:同一个变量名称可以在不同时间绑定不同类型的对象。

复制代码
x = 10
x = "robot"
x = [1, 2, 3]

强类型:不会为了完成所有运算而自动进行不合理的类型转换。

复制代码
a = "10"
b = 20
print(a + b)

会抛出:

复制代码
TypeError

需要显式转换:

复制代码
print(int(a) + b)  # 30

三、== 和 is 有什么区别?

这是两个含义完全不同的运算符。

  • ==:比较对象的值是否相等。

  • is:判断两个名称是否引用同一个对象。

例如:

复制代码
a = [1, 2, 3]
b = [1, 2, 3]
c = a
print(a == b)
print(a is b)
print(a == c)
print(a is c)

输出:

复制代码
True
False
True
True

用图表示:

特别注意:对于整数和字符串,Python 可能复用某些对象,因此不要依赖 is 比较普通数值。与 None 比较则应使用 is None。

四、可变对象与不可变对象

看看下面这段:

复制代码
a = [10, 20]b = ab.append(30)print(a)print(b)

运行结果:

复制代码
[10, 20, 30]
[10, 20, 30]

append() 修改的是列表对象本身,而 a 和 b 引用的是同一对象。

再比较:

复制代码
a = [10, 20]b = a.copy()b.append(30)print(a)print(b)

输出:

复制代码
[10, 20]
[10, 20, 30]

.copy() 创建了新的外层列表,但这是浅拷贝。当列表内部还有嵌套的可变对象时,仍然可能相互影响。

五、运算符与容易忽略的规则

复制代码
a = 17b = 5print(a / b)   # 3.4print(a // b)  # 3print(a % b)   # 2print(a ** b)  # 1419857

其中:

运算符 含义 关键特征
/ 真除法 通常返回 float
// 向下取整除法 向负无穷方向取整
% 取模 余数与向下取整配合
** 幂运算 计算乘方

特别注意负数:

复制代码
print(-17 // 5)  # -4print(-17 % 5)   # 3

因为:

\ -17=(-4)\\times5+3 \\

另一个常见问题是浮点精度:

复制代码
print(0.1 + 0.2 == 0.3)

结果为 False。

原因在于常见的二进制浮点格式无法精确表示部分十进制小数。对于精确十进制运算,可以使用 decimal.Decimal。

六、布尔值与隐式判断

以下表达式都是 False:

复制代码
bool(0)bool(0.0)bool("")bool([])bool({})bool(None)

但是:

复制代码
print(bool("False"))  # Trueprint(bool("0"))      # True

因为非空字符串通常为真,字符串内容是不是 "False" 并不影响这一规则。

还有一个比较特殊的细节:

复制代码
print(isinstance(True, int))  # Trueprint(True + 1)               # 2

Python 中 bool 是 int 的子类,但在业务代码中依然应该区分布尔逻辑和数字计算。

本讲编程训练

三道题目按基础应用、边界处理、引用机制递增。每题下方均提供可以直接运行的标准实现。

第 1 题:数值转换与格式化输出

要求编写程序,输入机械臂某关节的角度(单位:度),将其转换为弧度并保留四位小数。

公式:

\ \\text{弧度}=\\text{角度}\\times\\frac{\\pi}{180} \\

标准答案

复制代码
import mathangle = float(input("请输入角度:"))radian = angle * math.pi / 180print(f"角度:{angle:.2f}°")print(f"弧度:{radian:.4f} rad")

输入 90,得到:

复制代码
角度:90.00°
弧度:1.5708 rad

关键点:input() 返回字符串,float() 负责转换,:.4f 控制输出四位小数,不会改变原变量的数值。

第 2 题:关节角度限幅

要求输入目标角度,并将结果限制在 -180° 到 180° 之间。

例如输入 230 输出 180,输入 -200 输出 -180,输入 45 输出 45。

标准答案

复制代码
angle = float(input("目标角度:"))lower = -180upper = 180result = max(lower, min(angle, upper))print(f"限幅结果:{result:.1f}°")

关键点:min() 负责限制上界,max() 负责限制下界。这种写法常称为 clamp(限幅)。它只是数值限幅,并不等于完整的机械臂安全控制。

第 3 题:变量引用与列表复制

编写程序,实现以下要求:初始列表是 [0, 0, 0],创建两个新变量,其中一个与原列表共享对象,另一个拥有独立的列表;通过修改元素,验证二者区别。

标准答案

复制代码
original = [0, 0, 0]a = originalb = original.copy()a[1] = 90b[2] = 45print("original:", original)print("a:", a)print("b:", b)print("a is original:", a is original)print("b is original:", b is original)

运行结果:

复制代码
original: [0, 90, 0]
a: [0, 90, 0]
b: [0, 0, 45]
a is original: True
b is original: False

这个例子对应了一个非常重要的原理:赋值不会自动复制对象,改变可变对象与重新绑定变量是两件不同的事。

本讲核心知识检查

问题 结论
Python 变量保存的是什么? 对对象的引用绑定
== 和 is 的区别? 值相等与对象身份相同
list 和 tuple 的关键区别? list 可变,tuple 不可变
a = b 会创建副本吗? 不会
/ 和 // 的区别? 真除法与向下取整除法
bool("False") 是什么? True
0.1 + 0.2 == 0.3 是什么? False
.copy() 一定能复制所有嵌套对象吗? 不能,通常是浅拷贝
相关推荐
外收内放1 小时前
Python基础语法练习题(69)
开发语言·python
lojox1 小时前
深入理解 C++ STL:vector 底层实现、迭代器失效与 list 特性
开发语言·c++
TomEval1 小时前
【测AI】第11篇:深度学习基础 —— 神经网络是怎么工作的
人工智能·python·深度学习·神经网络·机器学习·aigc
iotxiaohu1 小时前
用 cflow 查看 C 函数调用关系
c语言·开发语言·cflow
zhang-ge1 小时前
python包和项目管理器uv在ubuntu下的安装与使用
开发语言·python·uv
for_ever_love__1 小时前
LangChain 降级、重试与超时:让服务在模型抽风时还能用
python·自然语言处理·langchain·agent·超时·重试·with_retry
MoRanzhi12032 小时前
第 8 篇 · 机器学习建模与实验评估:建模流程与对照实验
python·机器学习·scikit-learn·模型评估·交叉验证·shap·消融实验
棉猴2 小时前
玩游戏学Python9-算术运算符应用1
python·游戏·pygame·玩游戏·游戏编程
微笑星河q2 小时前
C++类和对象(下)初始化列表、类型转换、static、友元、内部类、匿名对象
开发语言·c++