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

这篇具有很好参考价值的文章主要介绍了Python 变量?对象?引用?赋值?一个例子解释清楚。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

哈喽大家好,我是咸鱼。

前天有个小伙伴找到我,给了我一段 python 代码:

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

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

在正式开始之前,让我们先弄清楚一些概念。

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

"Python 中一切皆对象",相信这句话大家在学习 Python 的时候都已经听的耳朵起茧子了吧。

在 Python 中,所有的数据都是对象,包括基本数据类型(例如整数、浮点数、字符串等)以及用户自定义的类型(类的实例等)。

对象其实是内存中分配的一块空间,用来存储其值。每个对象都有一个唯一的标识符(id),可以通过 id() 函数获取

不但如此,每一个对象都具有两个标准的头部信息:

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

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

在 Python 中,变量实际上是对象的【引用】,而不是对象本身的【存储】。当我们执行赋值语句时,会自动建立变量和对象之间的关系,即引用。

变量就像是一个指针,【指向】内存中存储对象的位置。

我们来看一个例子:

a = 1
b = a
a = a + 1

首先将 1 赋值于 a,即 a 指向了 1 这个对象。
Python 变量?对象?引用?赋值?一个例子解释清楚

接着 b = a 则表示让变量 b 也同时指向 1 这个对象。Python 的对象可以被多个变量所指向(引用)。

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

最后执行 a = a + 1,在这里需要注意的是,Python 的基础数据类型(例如整型(int)、字符串(string)等)是不可变的

所以,a = a + 1,并不是让 a 的值增加 1,而是表示重新创建了一个新的值为 2 的对象,并让 a 指向它。但是 b 仍然不变,仍然指向 1 这个对象。

因此最后的结果是,a 的值变成了 2,而 b的值不变仍然是 1

Python 变量?对象?引用?赋值?一个例子解释清楚
通过这个例子你可以看到,这里的 ab,开始只是两个指向同一个对象的变量而已,或者你也可以把它们想象成同一个对象的两个名字。

简单的赋值 b = a,并不表示重新创建了新对象,只是让同一个对象被多个变量指向或引用。

为什么?

在了解了变量、对象、引用、赋值之后,我们回到一开始的例子。

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

这段代码中创建了一个列表 a,其中包含两个元素(1 和 2),然后 a[1] 被赋值为整个列表 aa[1] = a),当你打印 a[1] 时,它实际上是指向列表 a 本身。

a = [1, <reference to a>]

这样就会导致循环引用的问题。
Python 变量?对象?引用?赋值?一个例子解释清楚

我们来分步骤解释一下这个过程:

  • 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]

关于浅拷贝深拷贝的内容咸鱼后期再写篇文章介绍一下!文章来源地址https://www.toymoban.com/news/detail-821502.html

到了这里,关于Python 变量?对象?引用?赋值?一个例子解释清楚的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python 变量赋值 修改之后 原值改变

     python 是一种动态语言,因此变量的类型和值 在运行时均可改变。当我们将一个变量赋值给另一个变量时,实际上是将变量的引用地址传递给新的变量,这意 味着新旧变量将指向同一个位置。因此,在更改其中一个变量的值时,另一个变量的值也会被更改。

    2024年02月14日
    浏览(41)
  • 在一个JS文件中引用另一个JS文件中的变量

    方法一,在调用文件的顶部加入下例代码: (注:有时你引用的文件还可能需要引用其他的js,我们需要将需要的那个js文件也以同样的方法引用进来) 方法二,通过中间界面对js进行应用 就是我们可以在某个html中引用了你需要的js文件,我们可以通过拿到那个html文件的对象,然

    2023年04月20日
    浏览(35)
  • python如何进行变量赋值和类型转换?

    当我们编写 Python 代码时,变量的赋值和类型转换是非常重要的操作。在本文中,我将告诉您如何在 Python 中进行变量赋值和类型转换。 ## 变量赋值 在 Python 中,变量赋值是一种基本操作,它允许我们将一个值绑定到一个变量上。变量可以是任何合法的标识符(由字母、数字

    2024年02月07日
    浏览(45)
  • 【蓝图】p40-p43对象引用、变量有效性、实现键盘控制物体自转、简单点名系统

    当在一个节点上需要连的线太多,或者需要连接到另一个图标中时,可以创建一个变量,把引脚传到变量里面,则此变量代替了节点的蓝图 操作方法1:新建一个变量,在变量类型里选择想要代替的蓝图 操作方法2:拉出蓝图引脚,选择提升为变量 注意:操作方法12创建出的变

    2024年02月15日
    浏览(36)
  • python多变量赋值和三元表达式出错(求解答)

    直接给出问题吧,以后只在定义是进行多变量同时赋值算了。希望有大神能够解答 我以为方法一和方法二是等价的,还是我太年轻了,根本不一样。 如果不是多变量在三元表达式里面用,法一和法二 倒是正常输出。如下示例

    2024年02月15日
    浏览(40)
  • C++的引用 拷贝赋值和引用赋值

        💯 博客内容:C++的引用 拷贝赋值和引用赋值 😀 作  者:陈大大陈 🚀 个人简介:一个正在努力学技术的准前端,专注基础和实战分享 ,欢迎私信! 💖 欢迎大家:这里是CSDN,我总结知识和写笔记的地方,喜欢的话请三连,有问题请私信 😘 😘 😘 目录 引用  引用

    2024年02月12日
    浏览(42)
  • 关于区块链、Web3.0、智能合约、DApp、DAO一文解释清楚

    区块链简单理解就是, 所有数据变成区块组成的链条,一个区块里保存着一条数据。 一笔支付、一个评论、一次查看、一条短信、一袋苹果都能保存为一个数据区块。 由于区块通过链条环环相扣,这确保了链上的数据是不可被篡改的。 链条复制了多条副本放置到多台互不相

    2024年02月02日
    浏览(69)
  • python引用from的变量报错Unresolved reference ‘xxxx‘

    我这里是一个文件中集中定义了常量,然后使用from xxxx import xxxx引入 然后发现执行报错: 而且在class中只有这一个def中的xxxx.常量会报错。并且其他def中引用都正常,手打时,pycharm提示也正常。 原因是我在def中for循环中写的是 这里与from重复了导致的报错 如果不是,那就检

    2024年02月10日
    浏览(35)
  • python一个请求chatgpt3.5模型例子

    当然可以!你可以使用OpenAI的 `openai.ChatCompletion.create()` 方法来请求 ChatGPT 3.5 模型的回复。以下是一个使用Python进行请求的示例代码: 在上面的代码中,你需要将 `\\\'YOUR_API_KEY\\\'` 替换为你的OpenAI API密钥。然后,代码通过 `send_message()` 函数将用户的输入发送给模型,并获取模型的

    2024年02月12日
    浏览(57)
  • Java中的各种引用类型以及部分引用的相关例子

    在Java中,引用类型主要有四种,分别是:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。这些类型通常与垃圾回收机制有关,用来描述对象的生命周期和可达性。下面详细介绍每一种引用类型: 强引用 (Strong Reference) 强

    2024年04月13日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包