1、变量到底是什么
在 Python 中变量到底是什么,有一个比喻我觉得非常好,变量就像便利贴。
为什么这么讲,我们定义一个数据,比如定义一个字符串或者整数,在内存中都会分配一个空间来保存,这个内存空间相当于一个小盒子,我们使用等号将这个数据赋值给一个变量时,实际上就像用便利贴贴到这个小盒子上,便利贴上还写了名称,就是变量名。所以说,变量和数据的关系只是一个指向的关系。
一个数据可以赋值给多个变量,相当于这个小盒子上面贴了多个便利贴;一个变量也可以被重新赋值,相当于把这个盒子上的便利贴撕了,贴到另一个盒子上。
变量和数据的关系,就是盒子和便利贴的关系,理解起来很容易。
函数名也是变量,是可以传参的变量,也同样是便利贴。
2、== 和 is 是一样的吗
这两个在编程中经常用到,好多同学经常搞不清楚应该用哪个。
- == 是比较两边的“值”是否相等;
- is 是判断是否为同一个对象,即 id 是否一样。
a = 1000
b = 1000
print(a == b)
print(a is b)
print(id(a), id(b))
True
True
140689217239312 140689217239312
这里有个很神奇的地方,分别定义了两个变量a, b,他们的值相等,但是这样定义应该是分配了2个内存空间,更有意思的是,如果你通过命令行执行以上代码,结果会不一样:
有这个符号的 >>>
表示是在命令行执行。
>>> a = 1000
>>> b = 1000
>>> print(a == b)
True
>>> print(a is b)
False
>>> print(id(a), id(b))
140601647494256 140601647494448
上面是使用 Pycharm
执行的,实际上Python解释器已经对经常使用到的小整数做了特殊处理,解释器会提前将 256 以内的整数申请内存空间,不会回收,以提升执行效率,所以在这个范围内的整数 id 永远是一样的。
>>> a = 256
>>> b = 256
>>> print(id(a), id(b))
9095360 9095360
>>> a = 257
>>> b = 257
>>> print(id(a), id(b))
140601647494512 140601647494384
Pycharm
在解释器的基础之上做了进一步的优化。
a = 1000000
b = 1000000
print(id(a), id(b))
140061167311120 140061167311120
你看,这么大的数字 id 也是相同的,Pycharm
就是这么酷。
3、del语句和垃圾回收
在 Python 中的垃圾回收机制是:引用计数(Reference Counting)。
简单讲就是每个对象内部有一个引用计数器,对象被创建或者被引用就会 +1,对象被销毁或者被赋予新的对象就会 -1
del 语句是作用在变量上,不是数据对象上。
a = 1
b = a
del a
打印 b 看下
print(b)
1
再打印 a 看下
print(a)
NameError: name 'a' is not defined
很明显,a 被删掉了。
之前看到国外的一个大佬讲 open 的这种写法不用关闭:
open("test.txt", "r").read()
很有意思是吧,这点没有用的小知识,相信你在网上应该查不到。当时觉得不太理解,后面理解垃圾回收之后才明白,使用 open 打开的文件对象创建之后,没有被其他引用,所以会被内存回收的,因而不用关闭也不影响。
邪门歪道哈,用 open 还是老老实实用 with 吧。