Python:赋值的本质其实是引用

news2024/11/27 22:31:45

相关阅读

Pythonicon-default.png?t=O83Ahttps://blog.csdn.net/weixin_45791458/category_12403403.html?spm=1001.2014.3001.5482


        在Python编程中,我们经常会遇到各种赋值操作,无论是简单的变量赋值,还是复杂的数据结构操作。表面上看,赋值就是把一个值“赋予”给另一个变量,但其实Python中的赋值并不像很多人理解的那样简单。赋值的本质其实是“引用”,这个概念在理解Python的内存管理和性能优化时尤为关键。

赋值的行为:引用还是拷贝?

        当我们在Python中进行赋值操作时,赋值号=的作用是让一个标识符引用某个对象,而不是像C语言那样是将值保存在标识符代表的内存空间中,这也解释了为什么Python无需定义数据类型。

# 例1
a = [1, 2, 3]
b = a

        如例1所示,在执行第一行代码时,首先会创建一个列表对象,随后用标识符a引用该对象。在执行第二行代码时,由于赋值号=右边是一个简单的标识符a,这代表标识符b也引用了列表对象(没有新对象创建)。

        可以使用sys包种的getrefcount函数获得一个标识符指向的对象被几个标识符引用,如例2所示。

# 例2
import sys
a = [1, 2, 3]
print(sys.getrefcount(a))  # 输出:2
b = a
print(sys.getrefcount(b))  # 输出:3

        第一个输出为2是因为在函数调用传参(可以理解为赋值)时,内部的形参也引用了列表对象。 

        使用内建函数id可以获得一个标识符指向对象的内存地址,例3显示两个标识符指向对象的地址是相同的,即指向的是同一个对象。

# 例3
a = [1, 2, 3]
b = a

print(id(a))  # 输出:2825757347904
print(id(b))  # 输出:2825757347904

        当通过标识符a或标识符b改变列表对象时(例如添加元素),同时会影响到另一个标识符(因为对象相同),如例4所示。

# 例4
a = [1, 2, 3]
b = a
b.append(4)

print(a)  # 输出:[1, 2, 3, 4]
print(b)  # 输出:[1, 2, 3, 4]
print(id(a))  # 输出:2248917209152
print(id(b))  # 输出:2248917209152

        但是有些情况下,赋值操作却会导致新对象的创建,如例5所示。

# 例4
a = [1, 2, 3]
b = a
b = "Test"
print(a)  # 输出:[1, 2, 3, 4]
print(b)  # 输出:Test
print(id(a))  # 输出:1714054847296
print(id(b))  # 输出:1714054845040

        要搞明白这点,首先得了解一些概念,可变对象与不可变对象。

可变对象

        可变对象是那些在创建之后可以通过标识符修改其属性或内容的对象,常见的可变对象包括:

列表

        可以添加、删除、修改元素。

a = [1, 2, 3]
a.append(4)  # 列表的内容改变
print(a)  # 输出:[1, 2, 3, 4]

字典

        可以增删键值对。

d = {'a': 1, 'b': 2}
d['c'] = 3  # 字典的内容改变
print(d)    # 输出:{'a': 1, 'b': 2, 'c': 3}

集合

        可以添加或删除元素。

d = {'a': 1, 'b': 2}
d['c'] = 3  # 字典的内容改变
print(d)  # 输出:{'a': 1, 'b': 2, 'c': 3}

字节数组

        可以修改其中的字节。

b = bytearray(b'abc')
b[0] = 100  # 修改字节
print(b)  # 输出:bytearray(b'dbc')

部分类实例

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

# 创建一个 Person 类的实例
p = Person("Alice", 25)

# 修改实例的属性
p.age = 26
print(p.age)  # 输出:26

 

不可变对象

        不可变对象在创建之后无法通过标识符修改其属性或内容的对象(这不代表该类对象没有属性,只是无法修改),常见的不可变对象包括:

整数

x = 10

浮点数

x = 3.14

字符串

s = "hello"

元组

t = (1, 2, 3)

冻结集合

d = frozenset([1, 2, 3])

字节串

b = b'abc'

        回到正题,当一个标识符已经引用了一个可变对象,且赋值号左侧是利用某些语法改变该对象的属性或内容时(例如列表索引、切片),此时不会创建新的对象。对于其他情况,比如一个标识符引用了一个不可变对象,或一个标识符已经引用了一个可变对象但赋值号左侧只有该标识符时(表示并不是改变该对象的属性或内容),此时则会将标识符引用赋值号右侧的另一个对象(这就可能导致新对象创建)

        例5展示了一些赋值行为背后的本质。

# 例5
a = [1, 2, 3]
b = a       # 列表对象有两个引用
a[0] = 2    # 利用标识符a改变可变列表对象的内容
b = "Test"  # 标识符b不再引用列表对象,而是引用一个新建的字符串对象
b = a       # 标识符b不再引用字符串对象,而是引用回之前的列表对象

        当一个对象没有任何标识符引用时会被自动回收,这很好理解,因为如果没有任何标识符能引用该对象,则无法再访问到该对象,自然它也就没有存在的意义了,例5中的字符串对象“Test”只有标识符b引用,因此在执行b = a后,字符串对象没有任何标识符引用了,因此会被回收。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2204334.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字工厂管理系统如何优化生产流程

在当今快速变化的制造业环境中,提高生产效率、降低成本并确保产品质量是企业持续发展的关键。数字工厂管理系统作为智能制造的重要组成部分,正逐渐成为优化生产流程、推动产业升级的重要工具。本文将探讨数字工厂管理系统如何通过智能化、自动化和数据分…

目标检测中的损失函数

损失函数是用来衡量模型与数据的匹配程度的,也是模型权重更新的基础。计算损失产生模型权重的梯度,随后通过反向传播算法,模型权重得以更新进而更好地适应数据。一般情况下,目标损失函数包含两部分损失,一个是目标框分…

基于单片机的穿戴式泳池遇险紧急呼救系统的设计

本计基于单片机的穿戴式泳池遇险紧急呼救系统装置。该装置采用STC12C5A60S2单片机与心率检测模块MAX30102的一体化脉冲血氧分析仪和心率监测器,对人体的心跳进行了实时检测。该装置由发送端和接收端两部分组成,中间由LORA无线通信模块进行数据传输&#…

使用Pytorch写简单线性回归

文章目录 Pytorch一、Pytorch 介绍二、概念三、应用于简单线性回归 1.代码框架2.引用3.继续模型(1)要定义一个模型,需要继承nn.Module:(2)如果函数的参数不具体指定,那么就需要在__init__函数中添加未指定的变量: 2.定义数据3.实例…

掌握未来技能:亚马逊云科技推出生成式 AI 认证计划!

目录 前言 生成式 AI 的力量 1. 内容创造的无限可能 2. 数据增强和个性化 3. 提高生产力 4. 教育和研究的辅助工具 5. 突破语言障碍 关于亚马逊云科技生成式 AI 认证 1. 认证目标 2. 认证内容 3. 认证优势 如何获得认证 1. 在线学习 2. 实践考试 3.AWS Certifie…

连肝了多天学习MySQL索引与性能优化,详细总结一下索引的使用与数据库优化

文章目录 索引是什么?索引的作用初步认识索引索引的类型按照数据结构分类BTREE索引 哈希索引 按功能逻辑进行分类唯一索引普通索引主键索引全文索引 按照字段的个数进行划分单列索引多列(组合,联合)索引 小结索引的设计原则数据准…

FreeRTOS——TCB任务控制块、任务句柄、任务栈详解

任务控制块结构体 任务控制块是 FreeRTOS 中用于描述和管理任务的数据结构,包含了任务的状态、优先级、堆栈等信息。 TCB_t的全称为Task Control Block,也就是任务控制块,这个结构体包含了一个任务所有的信息,它的定义以及相关变…

UE5蓝图学习笔记玩家碰撞触发死亡加一秒黑屏

UE5蓝图学习笔记玩家碰撞触发死亡加一秒黑屏 1.代表检测自身是否到和其他Actor碰撞。 2.判断Actor是否等于Player Pawn 3.摄像机在一秒钟褪色0-1。 4.Delay延时一秒执行。 5.获取当前关卡的名字。 6.重新加载当前的关卡 。 7.获取Get Plyer Pawn。 8.获取玩家相机控制器…

一次性语音芯片:重塑语音识别技术,引领智能化生活新时代

随着一次性语音芯片的突破性进展,语音识别技术正融入我们生活的方方面面,引领着智能化生活迈向一个全新的时代。这些芯片不仅体积小巧、成本低廉,更在性能上实现了质的飞跃,能够更精确地捕捉并理解人类语音。本文将解读关于一次性…

Scrapy网络爬虫基础

使用Spider提取数据 Scarpy网络爬虫编程的核心就是爬虫Spider组件,它其实是一个继承与Spider的类,主要功能设计封装一个发送给网站服务器的HTTP请求,解析网站返回的网页及提取数据 执行步骤 1、Spider生成初始页面请求(封装于R…

基于SpringBoot智能垃圾分类系统【附源码】

基于SpringBoot智能垃圾分类系统 效果如下: 系统首页界面 用户注册界面 垃圾站点页面 商品兑换页面 管理员登录界面 垃圾投放界面 物业登录界面 物业功能界图 研究背景 随着城市化进程的加速,生活垃圾的产量急剧增加,传统的垃圾分类方式已…

Java 集合 Collection常考面试题

理解集合体系图 collection中 list 是有序的,set 是无序的 什么是迭代器 主要遍历 Collection 集合中的元素,所有实现了 Collection 的集合类都有一个iterator()方法,可以返回一个 iterator 的迭代器。 ArrayList 和 Vector 的区别? ArrayList 可以存放 null,底层是由数…

Oracle RAC IPC Send timeout detected问题分析处理

一、报错信息 今天在进行数据库巡检时,在集群节点1发现了IPC相关报错信息: 2024-10-10T10:22:06.84631708:00 IPC Receiver dump detected. Sender instance 2 Receiver pnum 277 ospid 377527 [oraclezxsszpt-sjkfwq1 (PPA6)], pser 124403 2024-10-1…

飞行机器人专栏(十六)-- 双臂机器人体感交互式控制

目录 1. 概要 2. 整体架构流程 3. 控制系统设计 3.1 Vision-based Human-Robot Interaction Control 3.2 Human Motion Estimation Approach 4. 实现方法及实验验证 4.1 System Implementation 4.2 Experimental Setup 4.3 Experimental Results 5. 小结 ​​​​​​​ 1. 概…

Qt Creator 通过python解释器调用*.py

全是看了大佬们的帖子,结合chatGPT才揉出来。在此做个记录。 安装python在Qt Creator *.pro 文件中配置好环境来个简单的example.py调用代码安装pip添加opencv等库调用包含了opencv库的py代码成功 *.pro配置: INCLUDEPATH C:\Users\xuanm\AppData\Lo…

接口测试-day3-jmeter-2组件和元件

组件和元件: 组件:组件指的是jmeter里面任意一个可以使用的功能。比如说查看结果树或者是http请求 元件:元件指是提对组件的分类 组件的作用域:组件放的位置不一样生效也不一样。 作用域取决于组件的的层级结构并不取决于组件的…

论文阅读:OpenSTL: A Comprehensive Benchmark of Spatio-Temporal Predictive Learning

论文地址:arxiv 摘要 由于时空预测没有标准化的比较,所以为了解决这个问题,作者提出了 OpenSTL,这是一个全面的时空预测学习基准。它将流行的方法分为基于循环和非循环模型两类。OpenSTL提供了一个模块化且可扩展的框架&#xff…

算法: 前缀和题目练习

文章目录 前缀和题目练习前缀和二维前缀和寻找数组的中心下标除自身以外数组的乘积和为 K 的子数组和可被 K 整除的子数组连续数组矩阵区域和 前缀和题目练习 前缀和 自己写出来了~ 坑: 数据太大,要用long. import java.util.Scanner;public class Main {public static voi…

“国货户外TOP1”凯乐石签约实在智能,RPA助力全域电商运营自动化提效

近日,国货第一户外品牌KAILAS凯乐石与实在智能携手合作,基于实在智能“取数宝”自动化能力,打通运营数据获取全链路,全面提升淘宝、天猫、抖音等平台的运营效率与消费者体验,以自动化能力驱动企业增长。 KAILAS凯乐石…

雨晨 24H2 正式版 Windows 11 iot ltsc 2024 适度 26100.2033 VIP2IN1

雨晨 24H2 正式版 Windows 11 iot ltsc 2024 适度 26100.2033 VIP2IN1 install.wim 索引: 1 名称: Windows 11 IoT 企业版 LTSC 2024 x64 适度 (生产力环境推荐) 描述: Windows 11 IoT 企业版 LTSC 2024 x64 适度 By YCDISM 2024-10-09 大小: 15,699,006,618 个字节 索引: 2 …