12-python内存地址

news2024/12/29 9:05:33

1.查看内存地址

a=1
print(id(a)) # 2431929483504

2.数据类型
(1)不可变数据类型:数值、字符串、布尔值、元组
数据存储在计算机中的某个位置,不管赋值给谁,内存地址都相同

a="jack"
b="jack"
print(id(a))
print(id(b))
# 输出结果相同

在此例中,为字符串“jack”定义了两个别名a和b(即变量名a,b是对字符串地址的引用),便于我们表示这个字符串

a="jack"
b="jack"
print(id(a))
print(id(b))
print(id("jack"))
# 输出均相同

(2)可变数据类型:列表、字典、集合
对于可变数据类型,内存会开辟不同的内存地址存放相同的数据

a=[1,2,3]
b=[1,2,3]
print(id(a))
print(id(b))
# 输出结果不同

3.数据修改
(1)不可变数据类型
不同数据存放的地址不同,会使变量指向不同的地址

a=1
print(id(a)) # 2546017632496
a=2
print(id(a)) # 2546017632528

(2)可变数据类型
对数据的修改可视为在原地址上对数据的修改,地址不会改变

a=[1,2,3]
print(id(a)) # 2287597971776
a.append(4)
print(id(a)) # 2287597971776

嵌套同样,在下例中,a和b的地址均未发生变化

a=[1,2]
b=[3,a]
print(id(b)) # 2509191607104
a.append(4) # 对a修改,b不受影响
print(id(b)) # 2509191607104

4.浅拷贝
(1)直接赋值
拷贝的是内存地址,其中任一个的值发生变化,另一个也会跟随变化

a=[1,2]
b=a
print(id(a))
print(id(b))
# 相同
a=[1,[2,3]]
b=a
print(id(a[1][0]))
print(id(a[1][0]))
# 相同

(2)copy方法
(2-1)地址空间
①不可变-单层:相同

import copy
a=2
b=copy.copy(a)
print(id(a),id(b)) # 2110693638416 2110693638416

②可变-单层:不同

import copy
a=[1,2]
b=copy.copy(a)
print(id(a),id(b)) # 2426879856704 2426879856640

③可变-嵌套:整体不同,内部相同

import copy
a=[1,2,[1,2]]
b=copy.copy(a)
print(id(a),id(b)) # 1649968533504 1649968533376
print(id(a[2]),id(b[2])) # 1649968533568 1649968533568
print(id(a[2][0]),id(b[2][0])) # 1649966448880 1649966448880

④不可变-嵌套:相同

import copy
a=(1,2,[1,2])
b=copy.copy(a)
print(id(a),id(b)) # 2199230674304 2199230674304
print(id(a[2]),id(b[2])) # 2199230992448 2199230992448
print(id(a[2][0]),id(b[2][0])) # 2199228907760 2199228907760

(2-2)修改
①单层-可变:互不影响

import copy
a=[1,2]
b=copy.copy(a)
a.append(3)
print(a) # [1, 2, 3]
print(b) # [1, 2]

②单层-不可变:互不影响

import copy
a=(1,2)
b=copy.copy(a)
a=(3,4)
print(a) # (3, 4)
print(b) # (1, 2)

③嵌套-外层可变-内层可变:相互影响

import copy
a=[1,2,[3,4]]
b=copy.copy(a)
a[2].append(5)
print(a) # [1, 2, [3, 4, 5]]
print(b) # [1, 2, [3, 4, 5]]

④嵌套-外层可变-内层不可变:互不影响
不便于对内部元组元素进行修改,互不影响

⑤嵌套-外层可变-外层修改:互不影响

import copy
a=[1,2,(3,4)]
b=copy.copy(a)
a.append(5)
print(a) # [1, 2, (3, 4), 5]
print(b) # [1, 2, (3, 4)]

⑥嵌套-外层不可变-内层可变:相互影响

import copy
a=(1,2,[3,4])
b=copy.copy(a)
a[2].append(5)
print(a) # (1, 2, [3, 4, 5])
print(b) # (1, 2, [3, 4, 5])

⑦嵌套-外层不可变-内层不可变:互不影响
不便于对内部元组元素进行修改,互不影响

⑧嵌套-外层不可变-外层修改:互不影响
不便于对内部元组元素进行修改,互不影响

import copy
a=(1,2,(3,4))
b=copy.copy(a)
a=list(a)
a[0]=6
a=tuple(a)
print(a) # (6, 2, (3, 4))
print(b) # (1, 2, (3, 4))
  • 对以上提到的可变数据类型的b=copy.copy(a)均可写为b=a.copy() (无需导包)

[练习1]

import copy
a=[1,[2,3]]
b=copy.copy(a)
print(id(a),id(b)) # 不同
print(id(a[1][0]),id(b[1][0])) # 相同

[练习2]

a=[1,[11,22,33],(5,6,7)]
b=a.copy()
print(id(a),id(b)) # 不同
print(id(a[0]),id(b[0])) # 相同
print(id(a[1]),id(b[1])) # 相同
print(id(a[1][0]),id(b[1][0])) # 相同
print(id(a[2]),id(b[2])) # 相同
print(id(a[2][0]),id(b[2][0])) # 相同

[练习3]

# 可变数据类型的外部修改:互不影响
a=[1,[11,22,33],(5,6,7)]
b=a.copy()
a.append(6)
print(a) # [1, [11, 22, 33], (5, 6, 7), 6]
print(b) # [1, [11, 22, 33], (5, 6, 7)]

# 可变数据类型的内部可变修改:相互影响
a=[1,[11,22,33],(5,6,7)]
b=a.copy()
a[1].append(6)
print(a) # [1, [11, 22, 33, 6], (5, 6, 7)]
print(b) # [1, [11, 22, 33, 6], (5, 6, 7)]

[练习4]

a={"age":18,"name":"black"}
b=a.copy()
c=a # 拷贝的是内存地址,影响

a["age"]=2000
print(b) # {'age': 18, 'name': 'black'}
print(c) # {'age': 2000, 'name': 'black'}

浅拷贝总结(根据实验数据得出,仅供参考)
修改:嵌套可变数据类型的修改会导致变量的值同时变化
地址:不可变相同,可变不同(嵌套内部相同)

在这里插入图片描述

(3)切片

a=[1,2,3]
b=a[0:2]
print(b) # [1, 2]
print(a) # [1, 2, 3]
# 对于切片的拷贝,不受影响

5.深拷贝
(1)内存地址
①单层不可变:相同

import copy
a=1
b=copy.deepcopy(a)
print(id(a),id(b)) # 相同

②单层可变:不同

import copy
a=[1,2,3]
b=copy.deepcopy(a)
print(id(a),id(b)) # 不同

③嵌套-外层可变
外层不同,内层相同

import copy
a=[(1,2),3,(4,5)]
b=copy.deepcopy(a)
print(id(a),id(b)) # 不同
print(id(a[0]),id(b[0])) # 相同
print(id(a[0][0]),id(b[0][0])) # 相同

④嵌套-外层不可变
全部相同

import copy
a=((1,2),3,(4,5))
b=copy.deepcopy(a)
print(id(a),id(b)) # 相同
print(id(a[0]),id(b[0])) # 相同
print(id(a[0][0]),id(b[0][0])) # 相同

因此,深拷贝与浅拷贝的内存地址完全一致

(2)修改
①可变-单层:互不影响

import copy
a=[1,2]
b=copy.deepcopy(a)
a.append(3)
print(a) # [1, 2, 3]
print(b) # [1, 2]

②不可变-单层:互不影响

import copy
a=2
b=copy.deepcopy(a)
a=3
print(a) # 3
print(b) # 2

③外层可变-内层可变-嵌套:互不影响

import copy
a=[1,2,[3,4]]
b=copy.deepcopy(a)
a[2].append(5)
print(a) # [1, 2, [3, 4, 5]]
print(b) # [1, 2, [3, 4]]

④外层可变-内层不可变-嵌套:互不影响

import copy
a=[1,2,(3,4)]
b=copy.deepcopy(a)
a[2]=a[2]+(5,)
print(a) # [1, 2, (3, 4, 5)]
print(b) # [1, 2, (3, 4)]

⑤外层可变-外层修改-嵌套:互不影响

import copy
a=[1,2,(3,4)]
b=copy.deepcopy(a)
a.append(5)
print(a) # [1, 2, (3, 4), 5]
print(b) # [1, 2, (3, 4)]

⑥外层不可变-内层可变-嵌套:互不影响

import copy
a=(1,[2,3],(4,5))
b=copy.deepcopy(a)
a[1].append(6)
print(a) # (1, [2, 3, 6], (4, 5))
print(b) # (1, [2, 3], (4, 5))

⑦外层不可变-内层不可变-嵌套:互不影响
不便于对元组修改,地址空间基本都会变化
⑧外层不可变-外层修改-嵌套:互不影响
不便于对元组修改

深拷贝总结:
修改:各变量独立
地址(与浅拷贝相同):不可变相同,可变不同(嵌套内部相同)

在这里插入图片描述

总结

在这里插入图片描述

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

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

相关文章

常见分布式锁3:Redis setNx

Redis实现分布式锁的核心便在于SETNX命令,它是SET if Not eXists的缩写,如果键不存在,则将键设置为给定值,在这种情况下,它等于SET;当键已存在时,不执行任何操作;成功时返回1&#x…

【python游戏】努力制造阳光,让植物有力量对抗僵尸吧~

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 晃着脑袋生产阳光的向日葵,突突突吐着子弹的豌豆射手!​ 行动迟缓种类丰富的僵尸…… 印象最深的是“僵尸吃掉了你的脑子!” 还有疯狂的戴夫,无一不唤醒着我们的童年记忆​ 山…

Hive 拉链表的两种实现方式

目录 1.什么是拉链表 2.拉链表的产生背景 2.1数据同步 2.1.1全量同步 2.1.2增量同步 2.2增量同步和拉链表 3.拉链表的实现方式 3.1数据准备 3.2思路1 3.3思路2 1.什么是拉链表 我们首先要知道,拉链表是一个逻辑上的概念。 拉链表记录的是增量数据&#x…

(链表专题) 328. 奇偶链表 ——【Leetcode每日一题】

328. 奇偶链表 给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。 第一个 节点的索引被认为是 奇数 , 第二个 节点的索引为 偶数 ,以此类推。 请注意,偶…

在 RISC-V Linux 内核中添加模块

在 RISC-V Linux 内核中添加模块 flyfish 本例以添加helloworld字符设备为例 一 源码配置 1 源码 源码文件helloworld.c拷贝到 drivers/char 目录中 源码主要是输出Hello world init 2 Kconfig 打开drivers/char 目录下的Kconfig文件 在endmenu之前加上 config HELLO…

统信UOS专业版系统安装教程 - 全盘安装UOS系统

全文导读:本文介绍了UOS系统安装(全盘安装)的过程,如果没有特殊要求,推荐安装UOS系统都采用全盘安装。 准备环境 制作好统信UOS专业版启动U盘 一台CPU频率≥2GHz、内存≥4GB、硬盘≥64GB的电脑 安装步骤 一、制作…

MySQL复合查询

文章目录一、多表查询二、自连接三、子查询1.单行子查询2.多行子查询3.多列子查询4.在 from 子句中使用子查询5.合并查询一、多表查询 在实际开发中,数据往往来自不同的表,所以需要多表查询。 对多张表做笛卡尔积,实际上就是多张表的所有记…

js 特殊对象 - 数组

1.概述 数组也是对象的一种,数组是一种用于表达有顺序关系的值的集合的语言结构,也就是同类数据元素的有序集合。 数组的存储性能比普通对象要好,在开发中我们经常使用数组来存储一些数据。但是在JavaScript中是支持数组可以是不同的元素&…

使用CH9102F平替ESP32系列下载电路中的CP2102

乐鑫官方ESP32开发板的外围电路主要包含: USB-UART电路自动下载电路RC延迟电路重启按键下载按键电源降压芯片LDO下面简单介绍一下这些电路的功能。 ESP32的USB-UART电路部分,核心芯片CP2102。其作用是将USB接口传入的D、D-信号转换为串口信号RX、TX以及…

如何与 MACOM 建立 EDI 连接?

项目背景 MACOM提供高性能射频,微波和毫米波器件,其产品广泛应用于通信,航空航天,国防和工业市场。近年来MACOM在中国地区的业务一直高速增长。 为了提高其供应链的效率和准确性,MACOM使用EDI(电子数据交…

数据挖掘(4.1)--分类和预测

目录 前言 一、分类和预测 分类 预测 二、关于分类和预测的问题 准备分类和预测的数据 评价分类和预测方法 混淆矩阵 评估准确率 参考资料 前言 分类:离散型、分类新数据 预测:连续型、预测未知值 描述属性:连续、离散 类别属性&am…

扬尘天气在家如何防护措施 家里空气中的沙尘怎么处理

扬尘天气在家如何防护措施 家里空气中的沙尘怎么处理 大风起兮尘飞扬 风越强来,天越黄…… 随沙尘而来的还有呼呼呼的大风 刚刚过了一周 “阳光正好,微风不燥”的日子 还没好好感受春花绽放的温柔 沙尘天气就又杀回塔大了 除了吃土 “防护指南…

展心展力 metaapp:基于 DeepRec 的稀疏模型训练实践

作者 metaapp-推荐广告研发部:臧若舟,朱越,司灵通 1 背景 推荐场景大模型在国内的使用很早,早在 10 年前甚至更早,百度已经用上了自研的大规模分布式的 parameter server 系统结合上游自研的 worker 来实现 TB 级别…

【LeetCode】剑指 Offer(27)

目录 题目:剑指 Offer 53 - I. 在排序数组中查找数字 I - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 写在最后: 题目:剑指 Offe…

【机器学习 P19】【实战 P1】 MINST 手写数字识别

MINST 手写数字识别引入数据模型训练模型创建程序模型编译程序模型训练程序模型预测程序完整代码引入数据 MINST数据集是一个经典的手写数字识别数据集,由Yann LeCun等人创建。它包含了来自真实手写数字图片的70000个灰度图像,这些图像是由250个不同的人…

三行Python代码,让数据处理速度提高2到6倍

本文可以教你仅使用 3 行代码,大大加快数据预处理的速度。 Python 是机器学习领域内的首选编程语言,它易于使用,也有很多出色的库来帮助你更快处理数据。但当我们面临大量数据时,一些问题就会显现…… 在默认情况下,…

OpenShift 4 - 使用 virtctl 远程访问 OpenShift Virtualization 的虚拟机

《OpenShift / RHEL / DevSecOps 汇总目录》 说明:本文已经在支持 OpenShift 4.12 的 OpenShift 环境中验证 在《OpenShift 4 - 用 OpenShift Virtualization 运行容器化虚拟机 (视频)》一文中使用了 OpenShift 控制台直接访问运行在 OpenSh…

SQL中去除重复数据的几种方法,我一次性都告诉你​

使用SQL对数据进行提取和分析时,我们经常会遇到数据重复的场景,需要我们对数据进行去重后分析。以某电商公司的销售报表为例,常见的去重方法我们用到distinct 或者group by 语句, 今天介绍一种新的方法,利用窗口函数对…

MIT 6.S965 韩松课程 05

Lecture 05: Quantization (Part 1) 文章目录Lecture 05: Quantization (Part 1)动机数字的数据类型整数定点数浮点数量化基于 K-Means 的量化 [[Han et al., ICLR 2016]](https://arxiv.org/pdf/1510.00149v5.pdf)线性量化 [[Jacob et al. CVPR 2018]](https://arxiv.org/pdf/…

Makefile项目管理-----在Linux下编译c/c++程序

这里写目录标题起因makefile项目管理一、用途:二、 makefile的基础规则1.多文件联合编译2. makefile检测原理3. ALL来指定终极目标三、 makefile的两个函数和clean四、 makefile中的三个自动变量五、模式规则六、 静态模式规则七、 扩展1. 扩展1 伪目标2. 扩展2 可添…