变量就是一个名字
Python 中的变量,就是你贴在某个值上的名字。写下名字、一个等号,再写值:
三个变量,三个值,三种类型。Python 毫无怨言地同时存着它们,而你完全不用告诉它这些值是什么类型。值写在 = 后面,名字写在 = 前面。
变量一旦存在,凡是能用这个值的地方,都可以用这个变量:
有了这些名字,倒数第二行代码不用解释也能看懂。这正是好变量名的真正价值:代码读起来就像一段说明。
赋值不是数学
从数学课过来的人常会在这里被绊住:Python 中的 = 不是“等于”,而是“赋值”。它的意思是“取 = 后面的值,把它贴到前面的名字上”。Python 先求出值,再进行赋值。
所以下面的代码完全合法:
count = count + 1 这一行并不是在声称 count 等于 count 加一(这在数学上不可能)。它的意思是:先计算 count + 1,再把结果赋回给 count。Python 先求表达式的值,也就是 0 + 1,得到 1,然后才更新变量。
count = count + 1 你会写得非常频繁,所以 Python 提供了简写:count += 1 效果相同。
重新赋值改变的是标签,不是值
变量随时可以指向另一个值。旧值不会被修改,只是变量开始指向别的东西了:
注意最后几行。mood 前两次存的是字符串,然后突然存了一个整数,Python 也没有抱怨。这就是动态类型:变量没有固定的类型,只有值才有类型。这种灵活性在写原型时很有帮助,但如果变量在函数内部悄悄改变了含义,你又没察觉,就会很头疼。稳妥的习惯是:选一个与值所代表的含义相符的名字,然后让这个变量在整个生命周期内只代表这一样东西。
变量名的规则
Python 接受满足以下条件的名字:
- 以字母或下划线(
_)开头。 - 只包含字母、数字和下划线。
- 不是保留关键字(
if、for、class、return等几十个)。
所以这些是合法的:
而这些不合法:
2nd_user:不能以数字开头。user-name:不允许用连字符(Python 会把它当成减法)。class:保留关键字。user name:名字里不能有空格。
你已经知道,名字区分大小写:total、Total 和 TOTAL 是三个不同的变量。Python 不会帮你发现这种拼写错误。
命名约定
除了硬性规则,Python 社区还有一些约定。解释器不会强制执行,但整个生态都在遵守:
lower_snake_case用于普通变量和函数:retry_count、fetch_profile。UPPER_SNAKE_CASE用于常量:MAX_RETRIES = 5。PascalCase用于类名(后面会讲到类)。- 开头的下划线(
_something)暗示这个名字是私有的。并不强制,只是约定。 - 结尾的下划线(
class_)让你能用一个本来会和关键字冲突的名字。
坚持这些约定,你的代码看起来就会和其他人写的 Python 一样。
名字应该描述含义
变量名敲起来不费事,读起来却很费劲。多花几个字符,选一个真正能描述值的含义的名字,能让以后的读者(通常就是以后的你)省下很多琢磨的工夫。
对比一下:
代码相同,结果相同,但只有第二个版本告诉了你发生了什么。短名字(i、n、x)在很小的作用域里没问题,比如循环计数器,但在其他地方,请把名字写完整。
多重赋值(少用)
Python 允许在一行里把同一个值赋给多个变量:
也可以一次解包多个值:
只要能让代码更清晰(比如解包函数的返回值),两种写法都可以用。第一种链式的 = = = 写法值得留个心眼:三个变量最终都指向同一个对象,这对列表这样的可变类型有影响(后面会详细讲)。
要点回顾
name = value创建一个变量。- 变量没有类型,值才有类型。
- 名字要遵守几条硬性规则和很多软性约定,两者都值得尊重。
- 有描述性的名字是成本最低的文档。
下一篇:Python 实际支持哪些类型的值,包括整数、浮点数、字符串、布尔值,以及为什么分清它们很有帮助。
常见问题
Python 中如何创建变量?
起一个名字,在后面写 =,再在右边写上值。age = 30 创建了一个名为 age、值为 30 的变量。Python 会自动判断类型,你不需要声明。
Python 变量名有哪些规则?
名字可以包含字母、数字和下划线,但不能以数字开头,也不能是 if、class 这样的 Python 关键字。名字区分大小写:total、Total 和 TOTAL 是三个不同的变量。社区惯例是用 lower_snake_case。
Python 变量可以改变类型吗?
可以。Python 是动态类型语言,一个变量这一刻存着数字,下一刻就可以存字符串。这种灵活性很方便,但也可能让你措手不及:如果一个变量的含义在函数中途变了,通常说明该换个新名字了。