跳转至

P2-8.1 值(value)、变量(variable)、类型(type)

Section ID: P2-8.1 Version: v2026.07.20

在 P2-7 中,我们看过代码在哪里运行。既可以在 Colab 中运行,也可以在本地 PC(local PC)的终端中运行 Python 解释器(Python interpreter)。

从现在开始,我们会非常狭窄地恢复 Python 语法。但目的并不是背 Python 用法,而是抓住以后在把公式和数据读成代码时会反复遇到的通用概念。

这里与其说是要成为“很会用 Python 的人”,不如说是集中恢复 Python 的基础词汇,让你至少能读懂数学计算、小型数据确认,以及 NumPy 与 Pandas 的实践。

也就是说,现在学这些词的理由也很清楚。后面在读列表、字典、NumPy 数组、Pandas DataFrame 时,如果不能分清 现在处理的是值吗它的名字是什么它是数字还是字符串,那么连小例子也会很快卡住。

第一个词就是值、变量与类型。

这里会说明 值(value)变量(variable)类型(type) 的基本区分。这三个词并不只局限在 Python 里,而是大多数编程语言与数据处理工具共享的最小单位。以后在 Part 2 中再次遇到这些概念时,也把 概念词典 一起当作参照点。

这一节要留下的 3 句话

第一次阅读时,先抓住下面三句话就够了。

  1. 值(value)是计算实际处理的数据本身。
  2. 变量(variable)是为了再次调用这个值而贴上的名字。
  3. 类型(type)是区分这个值可以做什么的种类信息。

也就是说,后面在读列表、字典、NumPy 数组、Pandas DataFrame 时,也会先去问 现在看到的是值吗它是通过什么名字再次被指到的因为它是什么类型,所以能做哪些运算

如果说上一章的执行环境处理的是 这段计算要在哪里、由哪个程序来运行,这里处理的就是:在那个执行位置里,实际产生了哪些值,它们通过什么名字再次被指到,又是通过什么类型被区分。下一节开始,这些值会扩展到列表、字典、迭代、函数等更大的结构与处理流程中。

术语 本节先要抓住的意思
值(value) 计算实际处理的数据本身。
变量(variable) 为了再次指向这个值而贴上的名字。
类型(type) 区分这个值可以做什么的种类信息。
赋值(assign) 在 Python 中把值连接到名字上的动作。
基本类型(basic type) intfloatstrbool 这样一开始最常遇到的值种类。

核心判断标准:值(value)、变量(variable)、类型(type)

  • 能区分值(value)、变量(variable)、类型(type)。
  • 能说明 = 并不完全等同于数学中的等号,而是在 Python 中表示把值赋给名字(assign)的语法。
  • 能说明 intfloatstrbool 的基本差异。
  • 能用 type() 确认值的类型。
  • 能说明看起来像数字的字符串必须和真正的数字区分。
  • 能说明为什么 Python 看起来像是动态类型(dynamic typing)语言,但这并不表示类型可以毫无规则地混合。

三个标准

这里看的不是 Python 语法本身,而是代码如何处理数据。下面三个标准,会成为后面阅读列表、字典、迭代说明时的基础。

标准 为什么重要 本节所需的理解程度
值是计算实际处理的对象 数字、字符串、真假值为什么会有不同的行为,就是从这里开始的 理解代码里的 3"AI"True 都是值
变量是为了再次指向值而设置的名字 这对区分数学等号与 Python 的 = 很重要 能说明 score = 82 不是等式,而是命名
类型决定这个值上可以做哪些运算 它解释了为什么字符串和数字混在一起会报错 理解即使是同一个 +,也会因为值的种类不同而表现不同

值是计算所处理的真实对象

一般来说,值(value)就是计算的对象。数字、文本、真假这类程序真正处理的数据,就是值。

在 Python 中,像数字、字符串、真假值这样的值,会直接在代码里被创建并参与计算。

例如,下面这些都是值。

  • 3
  • 3.14
  • "AI"
  • True
  • False

值可以单独存在,也可以参与计算。

问题场景:我想先看一个最小的例子,确认一个数字值如何直接参与计算。 输入(input):整数值 32。 期望输出(output):把两个值相加的表达式 3 + 2。 要确认的概念:值可以直接出现在代码里,并成为运算的输入。

# 这个例子用来确认值、变量和类型在代码中如何区分。
3 + 2

问题场景:我想确认同一个 + 符号在字符串里会怎样不同地工作。 输入(input):字符串 "AI""Book"。 期望输出(output):把两个字符串连接起来的表达式。 要确认的概念:即使是同一个运算符,也会因值的类型不同而具有不同意义。

# 这个例子用来确认值、变量和类型在代码中如何区分。
"AI" + "Book"

上面这两行都使用了 +,但意思不同。第一行是数字加法,第二行是把字符串连接起来。即使是同一个符号,也可能因为值的类型(type)不同而有不同的行为。

Python 官方教程也会先把 Python 解释器当作计算器来使用,并首先介绍数字和文本。本节就把这个流程当作阅读 Python 代码的出发点。

总结如下。

视角 一般说明 在 Python 中
值(value) 计算处理的真实数据 可以直接写在代码里,例如 33.14"AI"True
运算(operation) 作用到值上的处理 通过 +>=、函数调用等表现出来
类型(type) 限制一个值可进行哪些动作的信息 即使是同一个 +,在数字和字符串上也会表现不同

一个显示名字和类型关系的小例子

在 Python 中,同一个名字随着时间流动,可以指向不同类型的值。

问题场景:我想直接确认同一个变量名可以指向不同类型的值。 输入(input):先把整数 82 放进 score,再把字符串 "82" 放进 score。 期望输出(output):score 的类型从 int 变成 str。 要确认的概念:在 Python 中,拥有类型的是值,而不是名字;一旦重新赋值,类型也可以变化。

1
2
3
4
5
6
# 这个例子用来确认值、变量和类型在代码中如何区分。
score = 82
print(type(score))

score = "82"
print(type(score))

第一个 score 指向整数(int)。第二个 score 指向字符串(str)。名字是同一个,但值变了,值的类型也跟着变了。

正因为这一点,Python 在一开始会让人觉得书写步骤比较短。每次创建变量时,不必先写类型声明。

但书写步骤短,并不表示什么值都能随便混在一起。

问题场景:我想看看如果直接把字符串和数字相加,会出现什么问题。 输入(input):字符串 "82" 和整数 3。 期望输出(output):因为类型不匹配而无法按预期计算的例子。 要确认的概念:即使它看起来像动态类型语言,不符合类型的运算也仍然会报错。

1
2
3
4
5
# 这个例子用来确认值、变量和类型在代码中如何区分。
score = "82"
bonus = 3

print(score + bonus)

这段代码不会按预期工作。因为字符串和数字不能直接相加。

因此,这个例子可以按下面这些标准整理。

  • 不必先写很多类型声明,也可以快速运行小段代码。
  • 阅读时要以“值拥有类型,而不是名字拥有类型”为标准。
  • 运行过程中类型不匹配时,可能会报错。
  • 所以在处理数据时,养成用 type() 确认的习惯很重要。

变量是贴在值上的名字

一般来说,变量(variable)是为了让值能够再次使用而贴上的名字。不同语言里的变量声明方式和类型规则会不同,但“通过名字去引用值”这一角色是共通的。

在 Python 中,可以用 = 给值贴上名字。

问题场景:我想确认最基本的模式:先给值贴名字,再通过这些名字继续计算。 输入(input):width = 20height = 45。 期望输出(output):会输出两个值相乘得到的 area。 要确认的概念:= 不是数学等号,而是把名字和数值连接起来的赋值语法。

1
2
3
4
5
# 这个例子用来确认值、变量和类型在代码中如何区分。
width = 20
height = 45
area = width * height
print(area)

这里的 widthheightarea 都是变量(variable)。

在数学里看到 x = 3 时,人们往往会把它读成等式。但在 Python 代码中,width = 20 更接近的不是“左右相等”的命题,而是一句执行语句:把 20 这个值贴上 width 这个名字。

因此,也可以像下面这样,再次把不同的值贴到同一个名字上。

问题场景:我想确认同一个变量名再次使用时,最终只会保留最后一个值。 输入(input):依次把 1012 赋给 score。 期望输出(output):最终输出 12。 要确认的概念:重新赋值会让同一个名字改为指向另一个值。

1
2
3
4
# 这个例子用来确认值、变量和类型在代码中如何区分。
score = 10
score = 12
print(score)

输出的值是 12。因为名为 score 的这个名字,先指向了 10,后来又改为指向 12

有时也会把变量解释成“盒子”。但在 Python 语境里,贴在值上的名字 这个标准更准确。这个差异在处理列表这类可变值(mutable value)时尤其重要。这部分会在 P2-8.2 中再次看到。

视角 一般说明 在 Python 中
变量(variable) 用来引用值的名字 如果理解为“名字指向对象”,后面就能接到列表的说明
赋值(assignment) 连接名字和数值的动作 score = 82 这样使用 =
重新赋值(reassignment) 让同一个名字改为指向另一个值的动作 可以像 score = "82" 一样,把不同类型的值重新贴到同一个名字上

类型会限制值能做什么

一般来说,类型(type)就是值的种类。更宽一点地看,类型是决定这个值可以做哪些计算、又不能做哪些计算的信息。

在 Python 中,可以通过 type() 来确认值的类型。

问题场景:我想一次看到一些典型基本值分别会被读成什么类型。 输入(input):33.14"AI"True。 期望输出(output):每个值的 type(...) 结果。 要确认的概念:基本数字、字符串、布尔值会被区分成不同类型。

1
2
3
4
5
# 这个例子用来确认值、变量和类型在代码中如何区分。
print(type(3))
print(type(3.14))
print(type("AI"))
print(type(True))

典型的基本类型如下。

类型 读法 示例 含义
int integer 3, 100 整数
float floating-point number 3.14, 0.5 带小数点的数
str string "AI", "42" 字符串
bool boolean True, False 真或假

Python 官方文档说明,整数值属于 int 类型,带小数部分的数属于 float 类型。文本则以 str 类型的字符串来处理。

在一般语言类型中,Python 处在什么位置

只有在看过值、变量和类型之后,才能稍微更准确地理解 Python 的特性。编程语言可以按很多标准分类,但这里不去背复杂分类,而只看阅读 Python 代码真正需要的几个角度。

区分 常见说明 看 Python 时重要的点
静态类型(static typing) 更倾向于在执行前严格检查变量或表达式的类型 想到 Java、C、C++ 这类语言时,往往会先看到像 int score 这样的类型声明
动态类型(dynamic typing) 在执行中由值实际携带类型,而名字倾向于指向这个值 在 Python 中,会像 score = 82.5 这样把值贴给名字,而值的类型是在运行中确认的
编译型语言(compiled language) 在执行前会明显看到单独的转换阶段 像 C/C++ 这类语言,编译阶段在学习初期就会非常显眼
解释型语言(interpreted language) 更突出“写完就运行并立即确认”的流程 Python 支持通过交互式提示符和脚本执行快速确认小段代码
脚本/胶水语言(scripting/glue language) 经常用于把现有工具、文件和系统连接起来的语言 Python 常出现在连接数据文件、库和分析工具的实践里

这个表不是为了严格分类语言。真实的语言与执行环境会更复杂。这里重要的是:Python 与其说是“要先声明很多类型再开始的语言”,不如说是“先产生值,再通过执行去确认”的流程更强。

Python 的官方摘要也把 Python 描述为高层次(high-level)、解释式(interpreted)、具有动态语义(dynamic semantics)的语言。这与本节把 Python 当成一种可以快速确认小计算的示例语言的理由正好相连。但正因为在真正运行前,类型问题未必会暴露,所以养成用 type() 检查的习惯很重要。

即使看起来像数字,也可能是字符串

最常见的混淆之一就是数字与字符串。

问题场景:我想确认即使表面看起来很像,数字和字符串的计算结果也会不同。 输入(input):数字 30 和字符串 "30"。 期望输出(output):数字那边是 31,字符串那边则是像 "301" 这样拼接起来的结果。 要确认的概念:看起来像数字的字符串,行为和真实数字计算不同。

1
2
3
4
5
6
# 这个例子用来确认值、变量和类型在代码中如何区分。
age_number = 30
age_text = "30"

print(age_number + 1)
print(age_text + "1")

30 是数字。"30" 是字符串。

所以 age_number + 1 会得到 31,而 age_text + "1" 则会把字符串拼接成 "301" 之类的结果。

这种差异在 AI 实践里也很重要。从 CSV 文件或 Excel 文件读取的值,表面上看起来像数字,但实际上可能是字符串。模型计算期待的是数值类型,如果数据是字符串,计算就会失败,或者必须先做预处理(preprocessing)。

例如,可以想到下面这些情况。

原始数据 人看到的意义 在 Python 中要确认什么
"100" 数量 100 确认它是字符串还是数字
"0.92" 概率分数 0.92 确认是否应该转换成 float
"True" 看起来像真的文本 确认它是不是真正的 bool
"2026-06-24" 日期 确认它是字符串还是日期类型

本节不要求你把所有类型转换都背下来,而是把下面这一点留下作为标准:一个值看起来是什么Python 实际把它当成什么类型处理 可能并不一样。

布尔值是条件判断的基本材料

布尔值(boolean)是一种只包含 TrueFalse 的类型。

问题场景:我想通过一个简单的分数标准,看看比较运算是怎样产生布尔值的。 输入(input):score = 92,标准值 60。 期望输出(output):输出 passed 的值以及它的类型。 要确认的概念:比较表达式的结果是 TrueFalse,也就是 bool 类型。

1
2
3
4
5
6
# 这个例子用来确认值、变量和类型在代码中如何区分。
score = 92
passed = score >= 60

print(passed)
print(type(passed))

score >= 60 是比较(comparison)。这个比较的结果就是 TrueFalse

在 AI 实践中,布尔值会经常出现。

  • 分数是否高于标准?
  • 数据中是否存在缺失值?
  • 预测值是否超过阈值(threshold)?
  • 是否满足划分训练数据和测试数据的条件?

在 Part 2 Chapter 5 中,我们区分过概率分数和服务决策。当时模型分数是数字,而通过政策条件之后的结果会转成行动。在 Python 中,这类条件判断就是通过布尔值来表达的。

一个小型数据处理例子

下面这个例子把一个学生分数当作数字来处理,并检查它是否超过标准。

问题场景:我想看看一个更接近真实数据的小例子:同时处理名字、分数、标准值与是否通过。 输入(input):学生名字、分数 82.5、标准值 60.0。 期望输出(output):依次输出名字、分数和是否通过。 要确认的概念:字符串、浮点数、布尔值可以在同一个例子里各自承担不同角色。

# 这个例子用来确认值、变量和类型在代码中如何区分。
student_name = "Kim"
score = 82.5
threshold = 60.0

passed = score >= threshold

print(student_name)
print(score)
print(passed)

如果把这里的值和类型拆开来看,就是下面这样。

名字 类型 含义
student_name "Kim" str 学生姓名
score 82.5 float 分数
threshold 60.0 float 通过标准
passed True bool 是否通过标准

这个例子虽然简单,但以后在数据处理和模型评估中会不断重复出现。

数据是以值的形式进来的。变量给这些值贴上名字。类型决定这些值能够以什么方式参与计算。

类型错误也可能是一个好信号

在 Python 中,如果类型不匹配,就可能报错。

问题场景:我想看看为什么把一个看起来像数字的字符串和真正的数字比较时会出问题。 输入(input):字符串 "82.5" 和浮点数 60.0。 期望输出(output):一个比较无法按预期工作的例子。 要确认的概念:即使数据看起来像数字,只要实际类型不同,比较和计算就可能失败。

1
2
3
4
5
# 这个例子用来确认值、变量和类型在代码中如何区分。
score = "82.5"
threshold = 60.0

print(score >= threshold)

这段代码不会按预期工作。score 看起来像数字,但实际上是字符串,而 threshold 是浮点数。

遇到这种错误时,与其说“Python 很奇怪”,不如先把问题换掉。

  • 这个值实际是什么类型?
  • 它是不是在读取文件时以字符串形式进来的?
  • 它是不是一个应该转换成数字的值?
  • 我有没有用 type() 去确认?

在数据处理中,类型错误虽然麻烦,但同时也是一个会告诉你数据当前状态的信号。

用案例来看

案例 1. 为什么从 CSV 里读出的分数算不起来

假设一位学习者想读取学生分数 CSV 并计算平均值。屏幕上看起来是 82.591.077.0 这样的数字,但真正去加或比较时,行为可能和预期不同。

人最先使用的标准通常是 看起来像数字,那就应该是数字吧。但在实际代码里,它可能是像 "82.5" 这样的字符串,而在这种情况下,加法或比较就不会像数字那样工作。

本节里的 变量类型 区分,正是为了阅读这种失败而准备的基本工具。值是真实数据,变量是贴在那个值上的名字,类型则决定这个值可以做哪些运算。因此,比起表面形状,更重要的是养成用 type() 确认实际类型的习惯。

可以确认的结果很简单。即使屏幕上看起来都是 82.5,如果 type(score)str,那在数值计算前就需要转换;如果它是 float,那就可以直接用于数值计算。

检查清单

  • 能区分值(value)、变量(variable)、类型(type)。
  • 能说明 Python 的 = 是把值赋给名字的语法。
  • 能说明 intfloatstrbool 的基本差异。
  • 能区分看起来像数字的字符串与真正的数字。
  • 能用 type() 确认值的类型。
  • 能说明当类型错误出现时,应该先检查数据状态。
  • 能先分清当前处理的是值本身、贴在它上的名字,还是它的类型吗?
  • 能说明为什么看起来像数字的值,在计算前仍然要先检查类型吗?

来源与参考资料

  • Python Software Foundation, What is Python? Executive Summary, Python.org,确认日期:2026-07-20。用于确认 Python 的动态语义(dynamic semantics)、动态类型(dynamic typing)和高层内置数据结构说明。
  • Python Software Foundation, An Informal Introduction to Python, Python 3.14.6 documentation,确认日期:2026-07-20。用于确认 Python 交互式示例中 prompt、数字、字符串和列表的介绍方式。
  • Python Software Foundation, Built-in Types, Python 3.14.6 documentation,确认日期:2026-07-20。用于确认 intfloatstrbool 等基本类型,以及不同类型对应的运算差异。
  • Python Software Foundation, Data model, Python 3.14.6 documentation,确认日期:2026-07-20。用于确认 Python 对象具有 identity、type、value 这一说明。