学径 LearnPath

编程语言基础

变量

世界先被测量为数字,再被人类以命名。

讲解模式

通过本节课,你将理解:

#goal

这世界唯一不改变是不停的改变。

在计算机中,我们使用变量 来描述在不停变化中的世界,比如房间的温度、湿度,同学的身高、年龄,国家的人口和GDP,然后才能在程序里被再次提起、修改,或交给下一步处理。

每一个变量在某个特定时刻,都会有一个特定的值,可能是数字,也可能是字符。值属于何种 数据类型,决定了哪些运算是合法的,比如数字可以加减,但字符就不行。

本节课你将学会:如何给变量起名字、赋值意味着什么、四种基本类型。

运行环境仍是本平台的 在线 IDE。

世界中的变量

#hook-variable

观察世界时,我们会发现周围的一切都会改变。

温度计「此刻的读数」随着时间上下变化,座位上同学也会随着毕业发生变化,我们在生活里已经在用「变量」来理解世界了。

教室墙上的温度计与座位表
教室墙上的温度计与座位表:栏目固定,读数与坐的人可以变。为本课绘制。

在代数中,变量更为常见。方程 s=vts = vt 里,ss、vv、tt 不是某一个固定的数,而是占位:路程、速度、时间各自可以取不同的值,关系却保持不变。解方程时写「设未知数为 xx」,也是先给「待求的那一项」一个名字,再谈它等于多少。代数之所以有力,正在于它允许我们谈论可变的量!

代数中的变量与符号
黑板上手写的 s = vt 与「设未知数为 x」:字母是可取值的占位。为本课绘制。

变量的声明与赋值

#explore-name

在 Python 里,我们可以很容易的声明一个变量。

如下代码所示,在一个空白的行,直接输入你意向中的变量名字,并且通过=给它一个初始值,你就得到了一个变量。

python
# 声明一个名为x的变量,并把初始值设为1
x = 1
# 将变量x当前的值输出显示
print(x)

然后,我们可以使用类似的方式,对变量的值进行修改:

python
x = 3
print(x)
x = 8
print(x)

是的!在Python里,如果需要修改变量的值,你需要通过代码自行进行修改,如果没有代码要求修改变量的值,它自己是不会变的。

你并不能随意的给变量起名字,如果你使用了某一些名字,会导致程序不能正常工作,比如:

python
# 将变量命名为print
print = 1
# 导致原本print的输出能力失效
print('hello, world!')

事实上,我们通常会在命名时遵守一定的规范,比如在Python领域影响最大的规范为 PEP 8。

根据PEP 8中的规定,我们应该尽量使用有实际含义的单词或缩写来命名,如果有多个单词,可以使用下划线进行区隔。

python
# 不推荐:看不出在记什么
a = 21.5
d1 = 3
n = '林安'

# 推荐:有意义的名字(下划线法)
temperature_c = 21.5
trial_id = 3
student_name = '林安'
is_valid = True

在科研领域,为了正确的处理数据,通常也会把单位或范围写进名字,减少误会:

python
height_cm = 168
speed_m_per_s = 3.0
sample_count = 12

Python在语法层面上支持使用中文来命名变量,可以使得代码的阅读体验对我们更为友好。但并不是所有的设备和系统都支持中文,如果使用中文可能会导致代码的可用性变差,并不推荐使用。

在给变量进行赋值时,我们使用了=,貌似没有问题,但它并没有看起来这么简单,我们需要展开来聊一下。

名字 = 表达式 的意思是:先算出右边的值(也许不需要计算),再让左边的变量的值修改为新的值。也就是说,=的两边只有在这一刻是相等的,之后可就不一定了。

举例来说:

python
# 变量x的值为3
x = 3
# 变量y的值设定为x的当前值,也就是3
y = x
# 将变量x的值改为4
x = 4
# 输出x,值为4
print(x)
# 输出y,值为3,与x不相同
print(y)

这样的机制,会让代码出现一些在数学课上看起来会奇怪的式子,比如 a = a + 1 ,在程序里非常常见:

python
# 变量x的值设定为3
a = 3
# 先计算=右边的值3+1=4,再把4这个计算结果给到变量a,更新a的值为4
a = a + 1
# 输出a
print(a)

也因为这样,用于根据变量原值来更新的语句经常使用,Python中还有一类复合了「计算与赋值」的特殊符号——赋值运算符,比如+=:

python
# 变量x的值设定为3
a = 3
# 意思为将变量a的当前值加一,相当于a=a+1
a += 1
# 输出a
print(a)

类似这样的运算符还有很多,我们会在下节课了解更多的基本运算后再探索。

四种基本数据类型

#explore-types

你可以对数字做加法,但不能对一段文字做加法。每个变量所拥有的值,也决定了它的数据类型,从而影响到后续的计算。

在Python中最常见的四种数据类型,分别对应四种对世界的描述方式:

类型含义可以描述什么例子
int整数物品的个数3
float浮点数(小数)速度、时间等物理量1.5
str字符串文本'林安'
bool布尔值真或假True

请注意:True 与 False 的首字母必须大写。

使用 type() 查看一个值属于哪种类型:

python
# 查询3、'3'、1.5、True的数据类型,并将结果输出显示
print(type(3))
print(type('3'))
print(type(1.5))
print(type(True))

上一课已经见过:print(2 + 3) 与 print('2 + 3') 结果不同。引号把内容声明为字符串。

python
count = 3
label = '3'
print(type(count))
print(type(label))
print(count + 1)
print(label + '1')

count 是整数;label 是字符串。count + 1 将被计算为4,但label + '1' 将得到 '31',因为在字符串类型里,+表示两段文字的拼接,不是进行加法运算。

这是程序非常容易出Bug的地方,错误的使用类型,程序不一定立刻报错,而可能安静地给出不符合预期的答案。

本节练习:一次钟摆记录

#practice

在 在线 IDE 里用下面这组数据记下一次钟摆观测:名称 '单摆A'(字符串)、次数 12(整数)、周期 2.0(浮点数)、是否可用 True(布尔值)。先打印这四个值和它们的 type,再把次数加上 1 后重新打印。次数应变为 13,类型仍是整数。

本节要点

#review
  • 变量用于表示一个可变的量,可以理解为一种装了数值的容器。
  • 变量的赋值先算右边,再让左边指向结果;再次赋值是覆盖,不是数学上的恒等。
  • 四种基本类型对应四种提问:个数(int)、连续量(float)、文本(str)、真假(bool)。
  • 不同的数据类型会影响运算规则。'3' + '1' 得到 '31',不是 4。

单选题

再次赋值会覆盖

下面程序运行后,两次 print 依次输出什么? x = 3 print(x) x = 8 print(x)

单选题

赋值不是永久相等

下面程序运行后,print(x) 与 print(y) 依次输出什么? x = 3 y = x x = 4 print(x) print(y)

单选题

命名习惯

按本节介绍的 PEP 8 习惯,哪一项更适合作为变量名?

单选题

更新原值

下面程序运行后,print(a) 的输出是什么? a = 3 a += 1 print(a)

单选题

类型决定运算

已知 count = 3,label = '3'。运行 count + 1 与 label + '1',结果分别是?

未登录时不会保存学习进度