Python进阶到高级:对象引用

2023-08-1808:14:44编程语言入门到精通Comments835 views字数 1415阅读模式

1、变量到底是什么

Python 中变量到底是什么,有一个比喻我觉得非常好,变量就像便利贴。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53929.html

为什么这么讲,我们定义一个数据,比如定义一个字符串或者整数,在内存中都会分配一个空间来保存,这个内存空间相当于一个小盒子,我们使用等号将这个数据赋值给一个变量时,实际上就像用便利贴贴到这个小盒子上,便利贴上还写了名称,就是变量名。所以说,变量和数据的关系只是一个指向的关系。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53929.html

一个数据可以赋值给多个变量,相当于这个小盒子上面贴了多个便利贴;一个变量也可以被重新赋值,相当于把这个盒子上的便利贴撕了,贴到另一个盒子上。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53929.html

变量和数据的关系,就是盒子和便利贴的关系,理解起来很容易。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53929.html

函数名也是变量,是可以传参的变量,也同样是便利贴。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53929.html

2、== 和 is 是一样的吗

这两个在编程中经常用到,好多同学经常搞不清楚应该用哪个。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53929.html

  • == 是比较两边的“值”是否相等;
  • 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个内存空间,更有意思的是,如果你通过命令行执行以上代码,结果会不一样:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53929.html

有这个符号的 >>> 表示是在命令行执行。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53929.html

>>> a = 1000
>>> b = 1000
>>> print(a == b)
True
>>> print(a is b)
False
>>> print(id(a), id(b))
140601647494256 140601647494448

上面是使用 Pycharm 执行的,实际上Python解释器已经对经常使用到的小整数做了特殊处理,解释器会提前将 256 以内的整数申请内存空间,不会回收,以提升执行效率,所以在这个范围内的整数 id 永远是一样的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53929.html

>>> a = 256
>>> b = 256
>>> print(id(a), id(b))
9095360 9095360
>>> a = 257
>>> b = 257
>>> print(id(a), id(b))
140601647494512 140601647494384

Pycharm 在解释器的基础之上做了进一步的优化。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53929.html

a = 1000000
b = 1000000

print(id(a), id(b))
140061167311120 140061167311120

你看,这么大的数字 id 也是相同的,Pycharm 就是这么酷。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53929.html

3、del语句和垃圾回收

在 Python 中的垃圾回收机制是:引用计数(Reference Counting)。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53929.html

简单讲就是每个对象内部有一个引用计数器,对象被创建或者被引用就会 +1,对象被销毁或者被赋予新的对象就会 -1文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53929.html

del 语句是作用在变量上,不是数据对象上。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53929.html

a = 1
b = a
del a

打印 b 看下文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53929.html

print(b)
1

再打印 a 看下文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53929.html

print(a)
NameError: name 'a' is not defined

很明显,a 被删掉了。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53929.html

之前看到国外的一个大佬讲 open 的这种写法不用关闭:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53929.html

open("test.txt", "r").read()

很有意思是吧,这点没有用的小知识,相信你在网上应该查不到。当时觉得不太理解,后面理解垃圾回收之后才明白,使用 open 打开的文件对象创建之后,没有被其他引用,所以会被内存回收的,因而不用关闭也不影响。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53929.html

邪门歪道哈,用 open 还是老老实实用 with 吧。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53929.html

作者:mikigo
来源:稀土掘金
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53929.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/ymba/53929.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定