变数 variable
“变数”是什么?简单来说,就是一个“内容会改变”的数,举凡文字、数字、布尔值 ( 逻辑 )、数组...等内容格式,都可以是变数所包含的内容,变数常见于数学公式,例如 xyz 座标、width 宽度或 height 高度,都是一种数字型态的变数。
快速导览:认识 Python 的变数、设定多个变数、设定多个变数的陷阱、重新设定变数、交换变数内容、变数后方的逗号、选择好的变数名称
本篇使用的 Python 版本为 3.7.12,所有范例可使用 Google Colab 实作,不用安装任何软件 ( 参考:使用 Google Colab )
认识 Python 的变数
Python 里的变数,表示的是“某个对象”的“名称”,当给予某个变数内容时,其实是将内容放入一个对象“容器”中储存,然后“给予这个对象一个变数名称”。
可以想像成将内容放到一个杯子 ( 容器 ) 里,接着在这个杯子上贴上标签 ( 名称 ),这个贴有标签的杯子,就是一个“变数”。
举例来说,下面的程序码,执行后会印出数字 1。
a = 1
print(a) # 得到結果 1
程序执行顺序为:
- 第一步:将数字 1 放入一个对象容器。
- 第二步:指定这个对象的名称为 a ( 变数 a = 1 )。
- 第三步:印出变数 a 的对象内容。
设定多个变数
因为 Python 变数的特性,同样一个对象可以赋予多个变数名称,下面的程序码,执行后,变数 a、b、c 都会是 1。
就像一个杯子上面,贴了各种不同标签。
a = 1
b = c = a
print(a) # 得到結果 1
print(b) # 得到結果 1
print(c) # 得到結果 1
程序执行顺序为:
- 第一步:将数字 1 放入一个对象容器。
- 第二步:指定这个对象的名称为 a ( 变数 a = 1 )。
- 第三步:让这个对象名称也有 b 和 c。
- 第四步:印出变数 a、b、c 的内容。
如果要一次设定多个变数的名称和内容,可以使用逗号分隔名称和内容 ( 注意变数的数量要和赋值的数量相同 ),下面的程序,只用了一行就设定了 a、b、c 三变数。
a, b, c = 1, 2, 3
print(a) # 1
print(b) # 2
print(c) # 3
设定多个变数的陷阱
如果变数的内容是串列、字典或集合,在处理“多个变数同时赋值”时容易会遇到陷阱,因为变数只是“标签”,当多个变数同时指向一个串列、字典或集合时,只要变数内容被修改 ( 并非使用等号赋值 ),不论这个变数是全域还是区域变数,另外一个变数内容也会跟着更动。
下方例子的变数 a 使用 append 的方式“修改”串列内容,就会造成 a 和 b 的内容同时被修改,但如果 c 是使用等号再次“宣告赋值”,c 和 d 就会指向不同的内容。
a = []
b = a
a.append(1)
print(a) # [1]
print(b) # [1] # 被影響
c = []
d = c
c = [1]
print(c) # [1]
print(d) # [] # 不受影響
同样的原理也可以应用在会被“全域变数和区域变数”影响的函数,下方的例子执行后,f1 函数的 a 不受作用域的影响,使用 append 发生“改变”后,不论 a 在何处都会被影响,连带 b 也被影响,但 c 因为是使用等号“宣告赋值”,就会转变成“区域变数”,因此在 f1 函数作用域之外的 c 就不会被影响,d 也不会被影响。
a = []
b = a
c = []
d = c
def f1():
a.append(1)
c = [1]
print(a) # [1]
print(b) # [1] # 被影響
print(c) # [1]
print(d) # [] # 不受影響
def f2():
print(a) # [1] # 被影響
print(b) # [1] # 被影響
print(c) # [] # 不受影響
print(d) # [] # 不受影響
f1()
f2()
重新设定变数
在同一层的程序里,变数名称都是不会重复的,如果重复使用了变数名称,则会将名称指派给另外一个对象,下面的程序码,执行后会印出数字 2 和 1。
就像从一个杯子上撕下标签,贴到另外一个杯子上。
a = 1
b = a
a = 2
print(a) # 得到結果 2
print(b) # 得到結果 1
执行顺序为:
- 第一步:将数字 1 放入一个对象容器。
- 第二步:指定这个对象的名称为 a ( 变数 a = 1 )。
- 第三步:让指定名称为 a 的对象也有另外一个名称 b ( 变数 b = 变数 a )。
- 第四步:将数字 2 放入一个对象容器,指定这个对象的名称为 a ( 将标签 a 从数字 1 的盒子上撕下来,贴到数字 2 的盒子上 )。
- 第五步:印出变数 a 和名称 b 的对象内容。
交换变数名称
在其他程序语言里,如果想要交换两个变数的值,通常会用另外一个变数暂存要交换的数值,在 Python 里可以一次进行多个变数的交换名称,下方的例子会将 a、b、c 的数值换成 b、c、a。
a = 1
b = 2
c = 3
print(a, b, c) # 1, 2, 3
a, b, c = b, c, a # 交換內容
print(a, b, c) # 2, 3, 1
同理,如果在变数赋值时,有变数的内容有做运算,同样会按照交换变数名称的方法,以当下的变数内容为主,下方的例子虽然按起来很类似,但因为 a 和 b 使用交换变数名称的方式,因此 a+b 运算时 a 等于 1,而 c 和 d 是按照顺序赋值,所以 c+d 时 c 的内容已经改变了。
a = 1
b = 2
a, b = b, a+b
print(a, b) # 2, 3
c = 1
d = 2
c = d
d = c + d
print(c, d) # 2, 4
变数后方的逗号
有时候在浏览一些程序时,会遇到宣告变数的后方多了一个“逗号”,在变数后方加上逗号,表示“tuple 的型别转换”,当 tuple 中“只有一个元素”的时候,变数后方加上逗号,就能将元组型别转换成文字或数字。
a = (1,)
b = ('b',)
c1 = a
c2, = a # 宣告時加上逗號
d1 = b
d2, = b # 宣告時加上逗號
print(c1) # (1,) # 還是 tuple
print(c2) # 1 # 變成數字
print(d1) # ('b',) # 還是 tuple
print(d2) # b # 變成文字
好的变数名称
帮变数命名的时候,需要把握一个重点:“看到变数的名称,就知道是储存什么数据”,因此变数名称如果取得不好,程序就会难以理解,Python 官方网站提供了以下几个变数名称的建议:
- 建议使用小写英文字母,例如 score。如果需要组合多个英文单字,可以在单字之间加上底线,例如:english_score。
- 如果变数的内容不要被修改( 其他程序语言称为“常数”,也就是内容不会改变的数 ),变数名称建议全部用大写英文字母,例如 MAX_NUMBER。
- 如果变数名称包含专有名词,例如 HTTP、APP,就使用原来的大小写格式,例如 HTTP_port、APP_port。
微信扫码关注
抖音扫码关注