Python进阶到高级:对象引用

2023年 8月 18日 85.2k 0

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 吧。

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论