Crossin的编程教室

Python 变量,是容器还是标签?

大家好,欢迎来到 Crossin的编程教室 !

今天我们来聊一些关于 Python 中变量的基础知识点。

1. 变量的赋值

之前说到,Python 中的「赋值」操作符就是一个等号(=)。通过赋值操作可以创建一个变量,也可以修改一个变量的已有值。

那有人就要说了:

为什么 a = 1 可以赋值,1 = a 就会报错?这不都是一个等式吗?

这是因为 Python 的赋值操作符(=)并不等同于数学中的等式。数学中等式满足交换律,左右两边互换没有问题。但编程中的赋值是有方向的,是把等号右边的结果赋值给左边的变量。

理解了赋值的方向性,很多语法就好理解了:

a = 1

就是把右边的数值1赋值给左边的变量a,这没毛病。

1 = a

右边是变量a的值这没问题,但左边被赋值的是一个数值,这就不行了,所以报错。❌

因为是把右边的“结果”赋值给左边的变量,所以右边不仅可以是一个固定值,也可以是个计算式:

a = 1 + 2 * 3 ** 4 / 5

这个计算式里也可以含有变量:

b = 3a = b * 2 + 3

甚至可以带有函数,只要保证计算式本身是可执行的就行:

a = input() + 'abc'

于是,被赋值的变量本身也可以作为右边计算式的一部分:

a = 2a = a + 1

这个式子以数学的眼光来看显然是不成立,但在编程中非常常见,作用就是把变量 a 的值增加 1。

它还有个简化写法:

a += 1

类似还有 -=、*=、/=、%=、//= 等等。

如果你学过 C++,应该知道这种变量自增 1 的语句还有种更简化的写法:

a++

但不好意思,这里是 Python,不能这么写。❌

至于数学中的等式,Python 更接近的比较运算符(==),比如:

a == 12 == a1+ 3 == a + 3

用来判断(==)左右两边的计算结果是否相等,结果是 True 或者 False。这个我们下回再来细说。

2. Python 变量不是一个「容器」

接下来讲的这点有一点点进阶。

很多人在了解的变量的使用之后,可能会把变量想象一个装数据的「容器」,就好比一个杯子,赋值就是往里面倒饮料,重新赋值就是倒上其他的饮料。

这种理解在 C++ 这样的语言里是没有问题的。也正因为如此,C++ 才需要在使用前「定义」变量,确定类型,程序也会分配好对应的内存空间。

但可惜,在 Python 里这个理解是错误的。❌

Python 里的变量,与其说是装数据的容器,倒不如说是贴在数据上的标签。

变量并不占用空间,占用空间的是数据本身。当你重新赋值时,就相当于撕下这个标签,贴纸另一个数据上。

Python 中所有东西都是对象,包括函数、类、模块,甚至是字符串’hello’,数字1、2、3,都是对象。

用个例子来说明:

a = 1b = 2c = 1# 再次赋值a = b

在这个代码里,a 和 c 其实指向的是同一个对象—整数 1。给 a 赋值为 b 之后,a 就变成了指向 2 的标签,但 1 和 c 都不会受影响。

示意图:

Image

更有说服力一点的验证:

a = 1print('a', a, id(a))b = 2print('b', b, id(b))c = 1print('c', c, id(c))# 再次赋值a = bprint('a', a, id(a))

输出:

a1 4301490544b2 4301490576c1 4301490544a2 4301490576

id() 可以认为是获取一个对象的地址。可以看出,a 和 c 开始其实是同一个地址,而后来赋值之后,a 又和 b 是同一个地址。

每次给变量重新赋值,它就指向了新的地址,与原来的地址无关了。

关于这方面的详细解释,可以参考之前的几篇文章:

对于 Python 的变量赋值,你还要什么想了解的内容?欢迎在留言区讨论。

以下是视频时间,欢迎大家关注、点赞、转发:

如果本文对你有帮助,欢迎点赞、评论、转发。你们的支持是我更新的动力~


Crossin的新书《码上行动:用ChatGPT学会Python编程》已经上市了。本书以ChatGPT为辅助,系统全面地讲解了如何掌握Python编程,适合Python零基础入门的读者学习。【点此查看详细介绍】
购买后可加入读者交流群,Crossin为你开启陪读模式,解答你在阅读本书时的一切疑问。
Crossin的其他书籍:

添加微信 crossin123 ,加入编程教室共同学习~
Image
感谢转发和点赞的各位~