小朋友们,你们好!欢迎来到Python魔法课堂。今天我们要学习一个非常基础但又超级重要的概念——变量。
你有没有想过,电脑是怎么记住你输入的名字、年龄、喜欢的食物的?就像你有一个小本子,可以在上面记下各种信息,然后随时翻看。在Python里,这个“小本子”就是变量。
学会了变量,你的程序就能“记住”东西,变得更聪明、更灵活!准备好了吗?让我们开始今天的冒险!
一、变量的本质
1.1 变量是什么?给数据贴标签
想象一下,你有一个漂亮的存钱罐。你在罐子上贴了一张标签,写着“我的零花钱”。从此以后,只要看到这个标签,你就知道里面存的是零花钱。而且,你可以随时往里面加钱,或者取出一部分——罐子里的钱会变化,但标签“我的零花钱”一直没变。
在Python里,变量就相当于这个标签。它不存数据本身,而是指向存放数据的地方。你可以给数据起一个名字,然后通过这个名字来使用数据。
name 是一个变量,它指向了字符串 "小明"。
age 是一个变量,它指向了整数 10。
当你使用 print(name) 时,Python 会根据 name 这个标签,找到它指向的数据 "小明",然后打印出来。
1.2 赋值运算符 = —— 把数据放进变量
在Python里,把数据“放进”变量的符号是 =,这叫赋值运算符。它的左边是变量名,右边是值(或者能算出值的表达式)。
x = 5 # 把整数5赋给变量xy = "hello" # 把字符串"hello"赋给变量yz = 3 + 2 # 先计算右边3+2=5,再把5赋给z
重点:= 不是数学里的等号,而是把右边的结果存到左边的变量里。
赋值的过程:Python 总是先计算等号右边的表达式,然后把结果赋给左边的变量。
x = 2x = x + 3 # 右边 x+3=5,然后把5赋给xprint(x) # 5
区分赋值 = 和相等比较 ==:
a = 10b = (a == 10) # 先比较a==10,得到True,然后把True赋给bprint(b) # 输出 True
1.3 变量的底层原理——内存小仓库的故事
为了让你们彻底理解变量,我们来讲一个“内存小仓库”的故事。
内存就像一排排小抽屉假设计算机的内存是一排排带编号的小抽屉。每个抽屉都有一个独一无二的号码(就像你的学号)。抽屉里可以放数据(数字、文字等)。
当你写 x = 5 时,Python 会做三件事:
找一个空抽屉,把数字 5 放进去(假设抽屉编号是 10086)。
在另一个地方记住:变量 x 指向抽屉 10086。
以后你写 print(x),Python 就去抽屉 10086 里取出 5。
变量改名会怎样?如果你接着写 x = 10,Python 会再找一个新抽屉(比如 10087),把 10 放进去,然后把 x 的指向改为 10087。旧的抽屉 10086 里的 5 如果不再被任何变量指向,就会被清理掉(这叫垃圾回收)。
a = 5print(id(a)) # 输出一个数字,比如 140735310356784a = 10print(id(a)) # 输出另一个不同的数字
id() 函数可以查看变量指向的抽屉编号(内存地址)。你会发现两次地址不同,说明指向了不同的抽屉。
为什么变量可以指向不同类型的数据?因为变量只是标签,不是抽屉本身。标签可以随便贴到任何抽屉上。所以同一个变量可以先指向数字,再指向字符串,再指向列表。
var = 100 # 指向数字抽屉var = "Python" # 指向字符串抽屉var = [1,2,3] # 指向列表抽屉
两个变量指向同一个抽屉(引用)如果你写 a = [1, 2, 3] 和 b = a,那么 a 和 b 两个标签都贴在同一个抽屉上。通过 b 修改抽屉里的内容,a 也会看到变化。
a = [1, 2, 3]b = a # b 也指向同一个列表b.append(4)print(a) # [1, 2, 3, 4] a 也变了!
如果想复制一个独立的列表,可以用 b = a[:] 或 b = a.copy(),这样会新开一个抽屉。
1.4 变量赋值的多种方法(让代码更简洁)
除了基本的 变量 = 值,Python 还提供了几种好用的赋值技巧。
平行赋值(同时给多个变量赋值)
a, b, c = 1, 2, 3print(a, b, c) # 1 2 3
链式赋值(多个变量指向同一个值)
x = y = z = 100print(x, y, z) # 100 100 100
增量赋值(自己更新自己)
count = 0count += 5 # 等价于 count = count + 5count *= 2 # 等价于 count = count * 2# 还有 -=, /=, //=, %=, **= 等
试试看:
用平行赋值把 "苹果", "香蕉", "橙子" 分别赋给 fruit1, fruit2, fruit3,然后打印。
用增量赋值写一个程序:初始 score = 80,然后加10分,再乘2,最后打印结果。
用 id() 查看两个链式赋值的变量是否指向同一个地址。
二、为什么需要变量?——让程序记住东西
如果没有变量,你每次要使用一个数据,都得重新写一遍。比如,你要打印三次“你好”,就得写三次 print("你好")。但如果有了变量,就可以这样:
count = 0count += 5 # 等价于 count = count + 5count *= 2 # 等价于 count = count * 2# 还有 -=, /=, //=, %=, **= 等
如果以后想把“你好”改成“大家好”,只需要改一处地方,非常方便!
变量让程序:
更简洁:不用重复写相同的数据。
更灵活:可以随时改变变量的值。
更易读:给数据起一个好名字,让人一看就懂。
试试看:定义一个变量 pi = 3.14,然后用它计算一个圆的面积(半径5)。公式:面积 = pi × 半径²。
三、变量的命名规则——取个响亮好记的名字
给变量起名字可不是随便乱起的,要遵守一些规则,否则Python会生气。
必须遵守的规则(否则会报错):
只能由字母、数字、下划线 _ 组成,不能有空格或其他符号。
不能以数字开头。比如 1var 是错误的,var1 可以。
不能是Python的关键字(后面会讲)。
区分大小写,Name 和 name 是两个不同的变量。
# 正确的变量名my_name = "小明"age2 = 10_private = "秘密"
# 错误的变量名2nd_place = "亚军" # 数字开头my-name = "小明" # 连字符不允许class = "三年级" # class 是关键字
建议的命名风格(让代码更优雅):
见名知意:用有意义的名字,比如 score 比 s 好。
使用下划线分隔:student_name 比 studentname 更易读。
常量用全大写:PI = 3.14(虽然Python不强制,但习惯这样表示不变的值)。
练习:判断变量名是否合法
下面有40个变量名,请你判断哪些是合法的,哪些是不合法的,并说出原因。你可以在Python交互环境中测试。
| | | |
|---|
| name | | |
| 2name | | |
| _score | | |
| my-name | | |
| hello_world | | |
| class | | |
| Class | | 关键字区分大小写,Class不是保留字(但建议避免) |
| student_age | | |
| 123 | | |
| _ | | |
| for | | |
| For | | |
| try | | |
| try1 | | |
| @name | | |
| True | | |
| true | | |
| None | | |
| nonlocal | | |
| _____ | | |
| a1b2 | | |
| 1a2b | | |
| 姓名 | | |
| 年龄 | | |
| return_value | | |
| return | | |
| is_ok | | |
| is | | |
| while_loop | | |
| while | | |
| apple | | |
| apple2 | | |
| apple_2 | | |
| apple-name | | |
| apple_name | | |
| __init__ | | |
| 你好 | | |
| 123你好 | | |
| print | | 内置函数名,虽然不是关键字,但强烈不建议(会覆盖原函数) |
| PRINT | | |
额外挑战:从下面随机列表中挑出所有合法的变量名:
2cool, cool2, _cool, cool_, cool-name, cool_name, lambda, Lambda, and, And, __cool__, cool123, 123cool
提示:可以在Python交互环境中快速验证,例如:
>>> apple = 1 # 不报错即合法>>> 2apple = 1 # 会报错 SyntaxError: invalid syntax
自己出题:再想出5个合法的变量名和5个不合法的变量名,交换给同桌判断。
四、Python关键字——不能用作变量名的“特权词”
Python 有一些单词已经被“征用”了,有特殊含义,所以你不能用它们做变量名。这些就是关键字(也叫保留字)。
Python 3 的关键字有:
False, True, None, and, as, assert, async, await, break, class, continue, def, del, elif, else, except, finally, for, from, global, if, import, in, is, lambda, nonlocal, not, or, pass, raise, return, try, while, with, yield
你可以用以下代码查看当前Python版本的所有关键字:
import keywordprint(keyword.kwlist)
注意:True, False, None 也是关键字,不能作为变量名。
试试看:尝试用 if 作为变量名,看看会报什么错误。
五、交换两个变量的值
交换两个变量的值是一个经典问题。想象你有两个杯子,一个装牛奶,一个装果汁,你想交换它们的内容。下面我们来看几种方法,其中方法一和方法二是必须掌握的,方法三是拓展知识。
方法一:使用临时变量(最通用、最安全)
这个方法就像找一个空杯子作为中转。我们把一个值先放在空杯子里,然后交换。
a = 10b = 20temp = a # temp 现在装着 a 的旧值 (10)a = b # a 变成 b 的值 (20)b = temp # b 变成之前存起来的 temp (10)print(a, b) # 输出 20 10
步骤图解:
temp = a → 把 a 的值(10)保存到 temp。
a = b → a 被覆盖为 b 的值(20)。
b = temp → b 得到 temp 里保存的旧值(10)。
优点:适用于任何类型(数字、字符串、列表等),不会出错。缺点:需要多一个变量。
方法二:使用Python特有的平行赋值(最简洁、最推荐)
Python 允许你在一行中交换两个变量的值,根本不需要临时变量!
a = 10b = 20a, b = b, a # 交换!print(a, b) # 输出 20 10
这行代码的含义是:先把右边的 b, a 打包成一个元组 (20, 10),然后按顺序解包赋值给左边的 a, b。效果完美,而且超级简单。
优点:一行搞定,可读性高,Python 特色。缺点:无(只要记住语法)。
方法三:使用加减法(仅适用于数字,不推荐)
这是一种“数学小魔术”,但有风险,只适用于纯数字,而且可能导致溢出(数字太大时)。
a = 10b = 20a = a + b # a 变成 30b = a - b # b 变成 30 - 20 = 10a = a - b # a 变成 30 - 10 = 20print(a, b) # 输出 20 10
原理:
a = a + b 让 a 变成两数之和。
b = a - b 从和中减去原 b,得到原 a,赋给 b。
a = a - b 从和中减去新的 b(即原 a),得到原 b,赋给 a。
缺点:
总结:平时写代码,用平行赋值 a, b = b, a 就够啦!如果面试中要求不用临时变量,可以用加减法;但一般情况下,推荐使用平行赋值。
试试看:
写一段代码,交换 x = "苹果" 和 y = "香蕉" 的值,然后用 print 验证。
用三种方法分别交换 p = 100 和 q = 200,观察结果是否一致。
尝试交换 m = 3.14 和 n = 2.71,看看哪些方法能用,哪些不能用?
六、冷门知识点——高手才知道的秘密
1. 变量本身没有类型,值才有类型
在Python中,变量只是一个“标签”,它可以指向任何类型的值。同一个变量可以先后指向数字、字符串、列表等。
var = 10 # var 是整数var = "hello" # 现在 var 是字符串var = [1,2,3] # 现在 var 是列表
2. 删除变量:del
你可以用 del 删除一个变量,之后就不能再使用它了。
a = 10del aprint(a) # 报错:NameError
3. 变量的作用域(简单提及)(选读)
变量有“地盘”概念,我们会在函数课程中详细学习。简单说,在函数内部赋值的变量是局部变量,外面看不到;在函数外赋值的变量是全局变量。
global_var = 100 # 全局变量def test(): local_var = 50 # 局部变量 print(global_var) # 可以读取全局变量test()print(local_var) # 报错
4. is 和 == 的区别
== 比较两个变量的值是否相等;is 比较两个变量是否指向同一个对象(即内存地址相同)。
a = [1,2,3]b = [1,2,3]print(a == b) # True,值相等print(a is b) # False,不同对象c = aprint(a is c) # True,指向同一个对象
5. 变量名可以用中文(但不推荐)
Python 3 支持 Unicode 标识符,所以你甚至可以用中文做变量名。
姓名 = "小明"年龄 = 10print(姓名, "今年", 年龄, "岁")
虽然可以,但不建议,因为可能引起兼容性问题,而且不符合国际惯例。
6. 使用 _ 作为临时变量
有时候我们不需要某个值,可以用下划线 _ 作为变量名,表示“这个值我不关心”。
for _ in range(5): print("Hello")
7. 变量解包(高级平行赋值)(选读)
a, *rest = [1, 2, 3, 4]print(a) # 1print(rest) # [2, 3, 4]
*rest 会收集剩余的元素到一个列表中。
8. 增量赋值的扩展(*=, /=, 等)
增量赋值不仅适用于数字,也适用于字符串、列表等。
s = "Hi"s *= 3print(s) # "HiHiHi"lst = [1, 2]lst += [3, 4]print(lst) # [1, 2, 3, 4]
七、综合小挑战
交换三个变量:写出代码,按 a, b, c = 1, 2, 3,通过一系列交换,变成 a=3, b=1, c=2。提示:可以多次使用 a, b = b, a 这样的交换。
温度转换:创建一个变量 celsius = 25,编写代码计算华氏度,公式:fahrenheit = celsius * 9/5 + 32,并将结果赋给新变量 fahrenheit,然后打印。
统计输入:让用户输入三个数字,用三个变量存储,然后计算它们的和与平均值。
判断变量类型:定义一个变量 x = 100,然后用 type(x) 查看它的类型,再把它改为字符串 "hello",再次查看类型。
变量引用实验:创建列表 a = [1, 2],然后用 b = a,再修改 b[0] = 99,打印 a,观察变化。再用 c = a[:],修改 c[1] = 88,打印 a,再次观察。
终极交换题:不用平行赋值,也不用临时变量,只用加减法交换两个数字。写出代码并测试。
变量名大闯关:根据第三部分的规则,自己写出10个合法的变量名和10个不合法的变量名,并让朋友验证。
八、总结
今天我们学习了变量的魔法:
变量的本质:变量是标签,指向内存中的“抽屉”;赋值 = 是把右边结果存入左边变量;内存中每个数据都有唯一编号 id;多个变量可以指向同一个对象。
为什么需要变量:让程序记住信息,更简洁灵活。
赋值方法:普通赋值、平行赋值、链式赋值、增量赋值。
命名规则:字母数字下划线,不能数字开头,不能是关键字。
关键字:Python 保留的单词,不能用作变量名。
交换变量:三种方法,推荐 a, b = b, a。
冷门知识:变量无类型、引用概念、del 删除、is vs ==、中文变量名等。
变量是编程的基石,每一个程序都离不开它们。从现在起,养成给变量起好名字的习惯,并记住:变量是标签,不是盒子;赋值是把标签贴到新东西上。
最后的小作业:写一个程序,用变量记录你的一天:早上几点起床、早餐吃了什么、上了什么课、晚上几点睡觉。然后用 print 把它们连成一段话。再交换“早餐”和“晚餐”的变量值,观察变化。最后,用 id() 打印每个变量指向的地址。