哈喽大家好,我是咸鱼。
前天有个小伙伴找到我,给了我一段 python 代码:
a = [1, 2]
a[1] = a
print(a[1])
然后问我为什么结果是 [1, [...]]
,我一看这个问题有意思,我说三言两语解释不清楚,我写篇文章到时候你看下吧,于是有了今天这篇文章。
在正式开始之前,让我们先弄清楚一些概念。
对象?变量?引用?赋值?
“Python 中一切皆对象”,相信这句话大家在学习 Python 的时候都已经听的耳朵起茧子了吧。
在 Python 中,所有的数据都是对象,包括基本数据类型(例如整数、浮点数、字符串等)以及用户自定义的类型(类的实例等)。
而对象其实是内存中分配的一块空间,用来存储其值。每个对象都有一个唯一的标识符(id),可以通过 id()
函数获取。
不但如此,每一个对象都具有两个标准的头部信息:
- 类型标志符(Type Identifier): 每个对象都有一个类型信息,可以通过
type()
函数获取。 - 引用计数器(Reference Counter): 引用计数器表示有多少个引用指向该对象,当引用计数降为零时,对象会被垃圾回收。( Python 也使用其他垃圾回收机制,例如循环垃圾回收器来处理引用环的情况。)
在 Python 中,变量实际上是对象的【引用】,而不是对象本身的【存储】。当我们执行赋值语句时,会自动建立变量和对象之间的关系,即引用。
变量就像是一个指针,【指向】内存中存储对象的位置。
我们来看一个例子:
a = 1
b = a
a = a + 1
首先将 1
赋值于 a
,即 a
指向了 1
这个对象。
接着 b = a
则表示让变量 b
也同时指向 1
这个对象。Python 的对象可以被多个变量所指向(引用)。
最后执行 a = a + 1
,在这里需要注意的是,Python 的基础数据类型(例如整型(int)、字符串(string)等)是不可变的
所以,a = a + 1
,并不是让 a
的值增加 1
,而是表示重新创建了一个新的值为 2
的对象,并让 a
指向它。但是 b
仍然不变,仍然指向 1
这个对象。
因此最后的结果是,a
的值变成了 2
,而 b
的值不变仍然是 1
。
通过这个例子你可以看到,这里的 a
和 b
,开始只是两个指向同一个对象的变量而已,或者你也可以把它们想象成同一个对象的两个名字。
简单的赋值 b = a,并不表示重新创建了新对象,只是让同一个对象被多个变量指向或引用。
为什么?
在了解了变量、对象、引用、赋值之后,我们回到一开始的例子。
a = [1, 2]
a[1] = a
print(a[1])
这段代码中创建了一个列表 a
,其中包含两个元素(1 和 2),然后 a[1]
被赋值为整个列表 a
(a[1] = a
),当你打印 a[1]
时,它实际上是指向列表 a
本身。
a = [1, <reference to a>]
这样就会导致循环引用的问题。
我们来分步骤解释一下这个过程:
a
是一个包含两个元素的列表:[1, 2]
。a[1] = a
将列表a
的第二个元素设为a
,即a[1]
实际上指向列表a
本身,形成了一个循环引用- 当打印
a[1]
时,Python 发现这是一个特殊的情况,即这个元素是对列表本身的引用。为了避免无限循环,Python 会显示...
,表示引用已经进入了一个循环。因此看到的结果是[1, [...]]
。
那如何避免循环引用呢?可以使用浅拷贝或者深拷贝来解决。
我们用浅拷贝来试一下:
import copy
a = [1, 2]
a[1] = copy.copy(a)
print(a[1])
# 结果是[1,2]
浅拷贝创建一个新的对象,然后将原始对象中的元素复制到新对象中。但是,如果原始对象的元素是可变对象(例如列表),那么浅拷贝只会复制对象的引用而不是对象本身。
就比如上面的例子:
a = [1, 2]
创建了一个列表a
,其中有两个元素 1 和 2。a[1] = copy.copy(a)
将列表a
的第二个元素修改为对列表a
的浅拷贝。- 打印
a[1]
,此时a[1]
指向了新的对象[1, 2]
关于浅拷贝深拷贝的内容咸鱼后期再写篇文章介绍一下!
以上就是“Python 变量?对象?引用?赋值?一个例子解释清楚”的全部内容,希望对你有所帮助。
关于Python技术储备
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python必备开发工具
三、Python视频合集
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
五、Python练习题
检查学习结果。
六、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
最后祝大家天天进步!!
上面这份完整版的Python全套学习资料已经上传至CSDN官方,朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。