news 2026/10/5 7:36:10

变量与数据类型——动态类型、类型注解与 Python 的数字世界

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
变量与数据类型——动态类型、类型注解与 Python 的数字世界
个人主页: > for_ever_love__ < (欢迎各位大佬莅临😊)
其他栏目: > 我想学python了 <

其他栏目: > iOS项目总结大全 <

其他栏目: > iOS UI <

文章目录

  • 变量与数据类型——动态类型、类型注解与 Python 的数字世界
    • 一、为什么大模型代码里全是变量和类型
    • 二、动态类型:赋值即定义
    • 三、基本数据类型一览
    • 四、数字的世界:int 不会溢出,float 要小心
      • 4.1 int 任意精度
      • 4.2 float 的精度陷阱
    • 五、类型注解:让大模型代码更好读、更稳
    • 六、常见坑与注意事项
    • 七、本篇小结

变量与数据类型——动态类型、类型注解与 Python 的数字世界

上一步我们把 Python 环境装好了,写出了第一个能跑的脚本。这一篇继续打地基:变量与数据类型。你可能会想"这太基础了吧"——但等你真正写大模型代码时会发现,变量和类型无处不在:模型的配置参数、一批 token 的 id 列表、张量的float32/float16精度,全都是"数据 + 类型"的组合。把这一篇吃透,后面读 PyTorch、Transformers 源码时才不会一头雾水。

一、为什么大模型代码里全是变量和类型

随便翻开一段训练脚本:

batch_size=32learning_rate:float=1e-4token_ids=[101,2023,2003,1037]# 一句话的 tokenweights=model.float()# 转成 float32 张量
  • batch_size是个整数,决定一次喂多少数据;
  • learning_rate标了float类型注解,说明它是浮点数;
  • token_ids是个列表,里面是整数——模型吃进去的不是文字,是这些 id;
  • weights是张量,但底层数据类型是float32。

你会发现:大模型项目对"数据是什么类型"极其敏感。一个该是float32的张量被当成float16,可能直接数值溢出;一个该是列表的配置被传成字符串,训练会莫名其妙报错。所以这一篇,我们把 Python 的类型系统讲清楚。

二、动态类型:赋值即定义

Python 是动态类型语言——变量不需要提前声明类型,第一次赋值就决定了它此刻的类型,而且类型还能随时变:

x=10# x 现在是 intprint(type(x))# <class 'int'>x="hello"# x 变成了 str,完全合法print(type(x))# <class 'str'>x=[1,2,3]# x 又变成了 listprint(type(x))# <class 'list'>

注意一个关键点:Python 的变量更像"贴在某个对象上的标签",而不是"装数据的盒子"。同一个对象可以贴多个标签(a = b = []),一个标签也能随时撕下来贴到别的对象上。理解这一点,后面才不会在"可变对象共享"的坑里栽跟头。

三、基本数据类型一览

类型字面量例子说明
int10、-3、0b1010任意精度整数,不会溢出
float3.14、1e-4双精度浮点(64 位)
boolTrue、False整数 1 和 0 的子类
str"hello"、'你好'不可变Unicode 文本
NoneTypeNone表示"空/无",常作默认值

bool其实是int的子类,True == 1、False == 0成立,但不要拿来做算术,容易把人看晕。

四、数字的世界:int 不会溢出,float 要小心

4.1 int 任意精度

C/Java 里的int有固定位数(32 位最大约 21 亿),超了就溢出。Python 的int是任意精度——只要内存够,多大都行:

big=2**1000print(big)# 一个 302 位的巨大整数,不会溢出print(big.bit_length())# 1001

这对大模型有意义吗?有。比如你处理超长文档的字符偏移、大语料的行号,不用担心溢出。

4.2 float 的精度陷阱

浮点数遵循 IEEE 754,存在二进制无法精确表示小数的问题:

print(0.1+0.2)# 0.30000000000000004,不是 0.3!print(0.1+0.2==0.3)# False

这正是大模型要用float32/float16而不是无限精度的原因——硬件只能用有限位存小数。所以比较浮点数要用容差,而不是直接==:

defapprox_equal(a,b,tol=1e-9):returnabs(a-b)<tolprint(approx_equal(0.1+0.2,0.3))# True

当你日后看到 loss 从2.3456变成2.3457就认为"没变化",或者做if loss == 0.0的判断,记住这个坑。

五、类型注解:让大模型代码更好读、更稳

Python 是动态类型,但现代大模型库(PyTorch、Transformers、vLLM)大量使用类型注解。为什么?因为项目太大,没有类型提示,人和 IDE 都看不懂函数该传什么。

fromtypingimportList,Optionaldefbuild_prompt(question:str,context:List[str])->str:"""拼接一个问题 + 若干上下文,返回完整 prompt"""parts:List[str]=[f"问题:{question}"]fori,cinenumerate(context,1):parts.append(f"参考{i}:{c}")return"\n".join(parts)config:Optional[dict]=None# 可能是 dict,也可能是 None
  • question: str表示参数应是字符串;
  • -> str表示返回值类型是字符串;
  • List[str]表示"字符串组成的列表",来自typing模块;
  • Optional[dict]表示"可能是 dict,也可能是 None"。

类型注解运行时不做强制检查(写错了不会报错),但配合mypy这类静态检查工具,能在运行前抓出一大类 bug。强烈建议从一开始就养成写注解的习惯。

六、常见坑与注意事项

坑现象解决办法
可变默认参数def f(x=[]): x.append(1)多次调用共享同一个列表默认用None,函数内再x = x or []
==与is混淆a == b比"值",a is b比"是不是同一个对象"比值得用==;比 None 用is None
浮点直接==0.1+0.2 == 0.3为 False用容差比较(见第四节)
动态类型运行时才报错x = "5"; x + 3报 TypeError写注解 + mypy,提前发现
None 当默认值踩坑把None当 0 或空串参与运算报错显式判断if x is None

两个高频错误重点说:

  1. 可变默认参数:这是 Python 头号经典坑。函数的默认参数在函数定义时就创建好了,之后所有调用共享它。正确写法永远是用None占位。
  2. is不是==:is判断"两个变量指向内存里同一个对象",==判断"值相等"。比如两个内容相同的列表a == b为 True,但a is b为 False。只有和单例(如None、True)比较时才用is。

七、本篇小结

这一篇我们搞清了:

  1. Python 是动态类型语言,变量是"贴在对象上的标签",类型可随时变。
  2. 五种基本类型int / float / bool / str / NoneType,其中int任意精度不会溢出,float有精度陷阱。
  3. 浮点数比较要用容差,不能直接==。
  4. 类型注解(str、List[str]、Optional)让大模型项目可读、可静态检查,强烈推荐用起来。
  5. 避开可变默认参数、is/==混淆等经典坑。

下一篇我们聊字符串处理——f-string 格式化、切片、以及用正则清洗文本。毕竟大模型吃的"粮食"就是文本,学会干净利落地处理字符串,是后面做分词、做 prompt 工程的前提。

本篇是《大模型开发从 0 到 1》专栏第 2 篇。专栏文章按「分类专栏」归类,顺序学习体验最佳。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/5 7:36:09

PLS-DA实战:小样本高维数据的可解释分类建模指南

做数据分析的朋友&#xff0c;大概率都遇到过这种场景&#xff1a;手里的样本只有几十个&#xff0c;变量却有几百上千个&#xff0c;而且这些变量之间相关性极高。近红外光谱、代谢组学质谱、电子鼻传感器响应&#xff0c;这类数据基本全是“样本少、变量多、变量还互相纠缠”…

作者头像 李华
网站建设 2026/10/5 7:35:09

Spring Boot接口加解密实战:RSA+AES+签名验签与等保合规方案

让你从头写一套接口加解密方案&#xff0c;可能大家第一反应都是“直接上全链路HTTPS不就行了”。但你要是真拿这种思路去做等保2.0的整改&#xff0c;等测评师拿抓包工具一看&#xff0c;发现业务请求体里的明文内容一眼就能读完&#xff0c;那你连整改说明都写不踏实。更实际…

作者头像 李华
网站建设 2026/10/5 7:34:59

智慧杯考试必备:综合素养竞赛高效备考与冲刺规划

1. 先搞清楚“智慧杯”到底考什么&#xff0c;再谈复习我带学生参加智慧杯这类综合知识竞赛已经不是一年两年了&#xff0c;每年都能看到不少考生拿着一堆资料埋头就刷&#xff0c;结果到了考场上发现题目风格和自己练的完全不是一回事。这个问题根源不在于不够努力&#xff0c…

作者头像 李华
网站建设 2026/10/5 7:34:44

FFmpeg零基础入门:从命令行转码到推流实战

很多朋友第一次听说 FFmpeg&#xff0c;脑子里冒出来的问题基本都一样&#xff1a;这玩意儿到底是个工具还是门语言&#xff1f;为什么网上教程东一个命令西一个命令&#xff0c;看着就头疼&#xff1f;作为一个天天跟视频打交道、被各种格式折磨过无数回的老兵&#xff0c;我可…

作者头像 李华
网站建设 2026/10/5 7:34:10

Claude Code 实战六条铁律:从安装验证到权限边界与多模型接入

Claude Code 最近在 AI 编程圈子里刷屏&#xff0c;真不是没道理的。但我说句实话&#xff0c;工具本身容易装&#xff0c;真正难的是把它嵌进你的日常工作流里&#xff0c;让它不乱跑、不瞎改、不烧钱。我把这 6 条实用提醒整理出来&#xff0c;全是从真实项目里踩过坑之后总结…

作者头像 李华
网站建设 2026/10/5 7:33:47

大数据毕设实战:Hadoop+Spark+Kafka+Hive+知识图谱构建动漫推荐系统

做了好几届大数据方向的毕业设计指导后&#xff0c;我发现一个现象&#xff1a;很多同学不是不会用框架&#xff0c;而是不知道一个完整的项目该怎么把这些框架串起来。标题里这套"HadoopSparkKafkaHive知识图谱"的组合&#xff0c;恰恰属于那种"单看每个组件都…

作者头像 李华