当前位置:首页 > 科技  > 软件

Python 变量?对象?引用?赋值?一个例子解释清楚

来源: 责编: 时间:2024-01-26 09:05:20 272观看
导读哈喽大家好,我是咸鱼。前天有个小伙伴找到我,给了我一段 python 代码:a = [1, 2]a[1] = aprint(a[1])然后问我为什么结果是 [1, [...]],我一看这个问题有意思,我说三言两语解释不清楚,写篇文章到时候你看下吧,于是有了今天这

哈喽大家好,我是咸鱼。guE28资讯网——每日最新资讯28at.com

前天有个小伙伴找到我,给了我一段 python 代码:guE28资讯网——每日最新资讯28at.com

a = [1, 2]a[1] = aprint(a[1])

然后问我为什么结果是 [1, [...]],我一看这个问题有意思,我说三言两语解释不清楚,写篇文章到时候你看下吧,于是有了今天这篇文章。guE28资讯网——每日最新资讯28at.com

在正式开始之前,让我们先弄清楚一些概念。guE28资讯网——每日最新资讯28at.com

guE28资讯网——每日最新资讯28at.com

对象?变量?引用?赋值?

"Python 中一切皆对象",相信这句话大家在学习 Python 的时候都已经听的耳朵起茧子了吧。guE28资讯网——每日最新资讯28at.com

在 Python 中,所有的数据都是对象,包括基本数据类型(例如整数、浮点数、字符串等)以及用户自定义的类型(类的实例等)。guE28资讯网——每日最新资讯28at.com

而对象其实是内存中分配的一块空间,用来存储其值。每个对象都有一个唯一的标识符(id),可以通过 id() 函数获取。guE28资讯网——每日最新资讯28at.com

不但如此,每一个对象都具有两个标准的头部信息:guE28资讯网——每日最新资讯28at.com

  • 类型标志符(Type Identifier):每个对象都有一个类型信息,可以通过 type() 函数获取。
  • 引用计数器(Reference Counter): 引用计数器表示有多少个引用指向该对象,当引用计数降为零时,对象会被垃圾回收。( Python 也使用其他垃圾回收机制,例如循环垃圾回收器来处理引用环的情况。)

guE28资讯网——每日最新资讯28at.com

在 Python 中,变量实际上是对象的【引用】,而不是对象本身的【存储】。当我们执行赋值语句时,会自动建立变量和对象之间的关系,即引用。guE28资讯网——每日最新资讯28at.com

变量就像是一个指针,【指向】内存中存储对象的位置。guE28资讯网——每日最新资讯28at.com

我们来看一个例子:guE28资讯网——每日最新资讯28at.com

a = 1b = aa = a + 1

首先将  1 赋值于  a,即 a 指向了  1  这个对象。guE28资讯网——每日最新资讯28at.com

guE28资讯网——每日最新资讯28at.com

接着 b = a 则表示让变量 b 也同时指向 1 这个对象。Python 的对象可以被多个变量所指向(引用)。guE28资讯网——每日最新资讯28at.com

guE28资讯网——每日最新资讯28at.com

最后执行 a = a + 1,在这里需要注意的是,Python 的基础数据类型(例如整型(int)、字符串(string)等)是不可变的guE28资讯网——每日最新资讯28at.com

所以,a = a + 1,并不是让 a 的值增加 1,而是表示重新创建了一个新的值为 2 的对象,并让 a 指向它。但是 b 仍然不变,仍然指向 1 这个对象。guE28资讯网——每日最新资讯28at.com

因此最后的结果是,a 的值变成了 2,而 b的值不变仍然是 1。guE28资讯网——每日最新资讯28at.com

guE28资讯网——每日最新资讯28at.com

通过这个例子你可以看到,这里的 a 和 b,开始只是两个指向同一个对象的变量而已,或者你也可以把它们想象成同一个对象的两个名字。guE28资讯网——每日最新资讯28at.com

简单的赋值 b = a,并不表示重新创建了新对象,只是让同一个对象被多个变量指向或引用。guE28资讯网——每日最新资讯28at.com

为什么?

在了解了变量、对象、引用、赋值之后,我们回到一开始的例子。guE28资讯网——每日最新资讯28at.com

a = [1, 2]a[1] = aprint(a[1])

这段代码中创建了一个列表 a,其中包含两个元素(1 和 2),然后 a[1] 被赋值为整个列表 a(a[1] = a),当你打印 a[1] 时,它实际上是指向列表 a 本身。guE28资讯网——每日最新资讯28at.com

a = [1, <reference to a>]

这样就会导致循环引用的问题。guE28资讯网——每日最新资讯28at.com

guE28资讯网——每日最新资讯28at.com

我们来分步骤解释一下这个过程:guE28资讯网——每日最新资讯28at.com

  • a 是一个包含两个元素的列表:[1, 2]。
  • a[1] = a 将列表 a 的第二个元素设为 a,即a[1]实际上指向列表 a 本身,形成了一个循环引用
  • 当打印 a[1] 时,Python 发现这是一个特殊的情况,即这个元素是对列表本身的引用。为了避免无限循环,Python 会显示 ...,表示引用已经进入了一个循环。因此看到的结果是 [1, [...]]。

那如何避免循环引用呢?可以使用浅拷贝或者深拷贝来解决。guE28资讯网——每日最新资讯28at.com

我们用浅拷贝来试一下:guE28资讯网——每日最新资讯28at.com

import copya = [1, 2]a[1] = copy.copy(a)print(a[1])# 结果是[1,2]

浅拷贝创建一个新的对象,然后将原始对象中的元素复制到新对象中。但是,如果原始对象的元素是可变对象(例如列表),那么浅拷贝只会复制对象的引用而不是对象本身。guE28资讯网——每日最新资讯28at.com

就比如上面的例子:guE28资讯网——每日最新资讯28at.com

  • a = [1, 2] 创建了一个列表 a,其中有两个元素 1 和 2。
  • a[1] = copy.copy(a) 将列表 a 的第二个元素修改为对列表 a 的浅拷贝。
  • 打印 a[1],此时 a[1] 指向了新的对象 [1, 2]

本文链接:http://www.28at.com/showinfo-26-68339-0.htmlPython 变量?对象?引用?赋值?一个例子解释清楚

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 突破性能瓶颈,C++代码优化攻略

下一篇: C++中关于构造函数的几个关键字

标签:
  • 热门焦点
  • 直屏旗舰来了 iQOO 12和K70 Pro同台竞技

    旗舰机基本上使用的都是双曲面屏幕,这就让很多喜欢直屏的爱好者在苦等一款直屏旗舰,这次,你们等到了。据博主数码闲聊站带来的最新爆料称,Redmi下代旗舰K70 Pro和iQOO 12两款手
  • 线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • 中国家电海外掘金正当时|出海专题

    作者|吴南南编辑|胡展嘉运营|陈佳慧出品|零态LT(ID:LingTai_LT)2023年,出海市场战况空前,中国创业者在海外纷纷摩拳擦掌,以期能够把中国的商业模式、创业理念、战略打法输出海外,他们依
  • 华为发布HarmonyOS 4:更好玩、更流畅、更安全

    在8月4日的华为开发者大会2023(HDC.Together)大会上,HarmonyOS 4正式发布。自2019年发布以来,HarmonyOS一直以用户为中心,经历四年多的发展HarmonyOS已
  • 华为Mate 60系列用上可变灵动岛:正式版体验将会更出色

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • 华为开发者大会2023日程公开:开设鸿蒙HarmonyOS 4体验区

    IT之家 7 月 31 日消息,华为今日公布了 HDC.Together 开发者大会 2023 的详细日程。整场大会将于 8 月 4 日-6 日之间举行,届时将发布最新一代鸿蒙 H
  • 滴滴违法违规被罚80.26亿 共存在16项违法事实

    滴滴违法违规被罚80.26亿 存在16项违法事实开始于2121年7月,历经一年时间,网络安全审查办公室对“滴滴出行”网络安全审查终于有了一个暂时的结束。据“网信
  • 与兆芯合作 联想推出全新旗舰版笔记本电脑开天N7系列

    联想与兆芯合作推出全新联想旗舰版笔记本电脑开天 N7系列。这个系列采用兆芯KX-6640MA处理器平台,KX-6640MA 处理器是采用了陆家嘴架构,16nm 工艺,4 核 4 线
Top