ToB企服应用市场:ToB评测及商务社交产业平台

标题: Python 变量?对象?引用?赋值?一个例子解释清楚 [打印本页]

作者: 数据人与超自然意识    时间: 2024-4-16 05:45
标题: Python 变量?对象?引用?赋值?一个例子解释清楚
哈喽大家好,我是咸鱼。
前天有个小伙伴找到我,给了我一段 python 代码:
  1. a = [1, 2]
  2. a[1] = a
  3. print(a[1])
复制代码
然后问我为什么结果是 [1, [...]],我一看这个问题有意思,我说三言两语解释不清楚,我写篇文章到时候你看下吧,于是有了今天这篇文章。
在正式开始之前,让我们先弄清楚一些概念。
对象?变量?引用?赋值?

"ython 中一切皆对象",相信这句话大家在学习 Python 的时候都已经听的耳朵起茧子了吧。
在 Python 中,所有的数据都是对象,包括基本数据类型(例如整数、浮点数、字符串等)以及用户自定义的类型(类的实例等)。
对象其实是内存中分配的一块空间,用来存储其值。每个对象都有一个唯一的标识符(id),可以通过 id() 函数获取
不但如此,每一个对象都具有两个标准的头部信息:

在 Python 中,变量实际上是对象的【引用】,而不是对象本身的【存储】。当我们执行赋值语句时,会自动建立变量和对象之间的关系,即引用。
变量就像是一个指针,【指向】内存中存储对象的位置。
我们来看一个例子:
  1. a = 1
  2. b = a
  3. 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,并不表示重新创建了新对象,只是让同一个对象被多个变量指向或引用。
为什么?

在了解了变量、对象、引用、赋值之后,我们回到一开始的例子。
  1. a = [1, 2]
  2. a[1] = a
  3. print(a[1])
复制代码
这段代码中创建了一个列表 a,其中包含两个元素(1 和 2),然后 a[1] 被赋值为整个列表 a(a[1] = a),当你打印 a[1] 时,它实际上是指向列表 a 本身。
  1. a = [1, <reference to a>]
复制代码
这样就会导致循环引用的问题。

我们来分步骤解释一下这个过程:
那如何避免循环引用呢?可以使用浅拷贝或者深拷贝来解决。
我们用浅拷贝来试一下:
  1. import copy
  2. a = [1, 2]
  3. a[1] = copy.copy(a)
  4. print(a[1])
  5. # 结果是[1,2]
复制代码
浅拷贝创建一个新的对象,然后将原始对象中的元素复制到新对象中。但是,如果原始对象的元素是可变对象(例如列表),那么浅拷贝只会复制对象的引用而不是对象本身。
就比如上面的例子:
关于浅拷贝深拷贝的内容咸鱼后期再写篇文章介绍一下!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4