(Python)可变类型不可变类型;引用传递值传递;浅拷贝深拷贝

从一段代码开始说事,先上代码:

a = [[1],[2],[3]]
b = [[4,5],[6,7],[7,8]]
for i,j in zip(a,b):print(i,j)i = [9]#i[0] = 8j[:2]=[1,2]print(i, j)
print(a)
print(b)

运行的结果:

[1] [4, 5]
[9] [1, 2]
[2] [6, 7]
[9] [1, 2]
[3] [7, 8]
[9] [1, 2]
[[1], [2], [3]]
[[1, 2], [1, 2], [1, 2]]

可以看到修改i的值不会造成数组a的值的修改,而修改j的值会造成数组b的值的修改,这是为什么呢?

可变类型与不可变类型

可变数据类型 :

当该数据类型的对应变量的值发生了改变,那么它对应的内存地址不发生改变,对于这种数据类型,就称可变数据类型。

不可变数据类型:

当该数据类型的对应变量的值发生了改变,那么它对应的内存地址也会发生改变,对于这种数据类型,就称不可变数据类型。

可变数据类型与不可变数据类型_可变类型和不可变类型-CSDN博客

引用传递与值传递

引用传递(Pass by Reference)

在引用传递中,函数接收的是变量的地址,也就是对象的引用。
当你把一个可变对象(如列表、字典等)传递给函数时,函数内部对该对象的修改会影响到原始的对象。
这是因为函数接收的是对象的引用,而不是对象的副本。
示例:

  def modify_list(lst):lst[0] = 'changed'my_list = [1, 2, 3]modify_list(my_list)print(my_list)  # 输出 ['changed', 2, 3]

值传递(Pass by Value)

在值传递中,函数接收的是变量的值的副本。
当你把一个不可变对象(如整数、字符串等)传递给函数时,函数内部对该变量的修改不会影响到原始的变量。
这是因为函数接收的是变量的值的副本,而不是变量本身。
示例:

  def modify_int(x):x = 'changed'my_int = 10modify_int(my_int)print(my_int)  # 输出 10

总的来说,在 Python 中,变量的赋值行为遵循以下规则:
对于可变对象,变量存储的是对象的引用,即引用传递。
对于不可变对象,变量存储的是对象的值,即值传递。

对一开始的问题做出简化,看以下两段代码

import copyb = [[4,5],[6,7],[7,8]]
c = b[0]print(id(b[0]))
print(id(c))d = [1,2]
print(id(d))
print(id(d[0]),id(d[1]))c = d
print(id(c))
print(id(c[0]),id(c[1]))
print(b)

数出的结果是

140383141636032
140383141636032
140381758507008
140383142445296 140383142445328
140381758507008
140383142445296 140383142445328
[[4, 5], [6, 7], [7, 8]]

可以看到以c=d这种方式改变c并不会修改b的值,因为这是一个最外层引用传递,此时c指定d指向的可变类型(数组)

import copyb = [[4,5],[6,7],[7,8]]
c = b[0]print(id(b[0]))
print(id(c))d = [1,2]
print(id(d))
print(id(d[0]),id(d[1]))c[:2] = d
print(id(c))
print(id(c[0]),id(c[1]))
print(b)

输出的结果是

140452090626176
140452090626176
140450707604352
140452091609328 140452091609360
140452090626176
140452091609328 140452091609360
[[1, 2], [6, 7], [7, 8]]

可以看到以c[:2]=d的这种方式,就是先进入c指向的可变数据类型的地址也就是进入到b[0]内部,找到b[0]内部存储的两个子对象的地址,再更改这两个子对象的地址,所以以这种方法更改c也会跟着更改原始的b。

看这个图会有更深入的理解

还看不懂看这个

一文读懂 Python 值传递和引用传递_python 引用传递-CSDN博客

浅拷贝与深拷贝

浅拷贝

只拷贝了对象,对象内的元素并不会发生拷贝。

深拷贝

不仅拷贝对象,对象内的元素也会发生拷贝。

浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。

上代码

import copyb = [[4,5],[6,7],[7,8]]
print(id(b))
print(id(b[0]),id(b[1]))c = copy.copy(b)
print(id(c))
print(id(c[0]),id(c[1]))e = copy.deepcopy(b)
print(id(e))
print(id(e[0]),id(e[1]))

运行结果

140133587657344
140134970720384 140133587652608
140133587657216
140134970720384 140133587652608
140133587657152
140133587847808 140133587847232

与上述描述相同

但是浅拷贝和深拷贝对处理可变类型数据与不可变类型数据还会有一些差异

更详细的内容请阅读:

一篇就懂:python浅拷贝copy与深拷贝deepcopy_python deepcopy-CSDN博客

可以结合以下代码来理解一下

import copyb = [[4,5],[6,7],[7,8],9]
e = [1,9]
print(id(b))
print(id(b[0]),id(b[1]))c = copy.copy(b)
print(c)
b[0][:] = e
print(b)
print(c)
b[3] = 3
print(b)
print(c)

上述代码的输出是

140440909761280
140442292905920 140440909723776
[[4, 5], [6, 7], [7, 8], 9]
[[1, 9], [6, 7], [7, 8], 9]
[[1, 9], [6, 7], [7, 8], 9]
[[1, 9], [6, 7], [7, 8], 3]
[[1, 9], [6, 7], [7, 8], 9]

参考文献

浅拷贝与深拷贝的区别_深拷贝和浅拷贝的区别-CSDN博客

可变数据类型与不可变数据类型_可变类型和不可变类型-CSDN博客

一文读懂 Python 值传递和引用传递_python 引用传递-CSDN博客

一篇就懂:python浅拷贝copy与深拷贝deepcopy_python deepcopy-CSDN博客

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

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

相关文章

Homebrew使用

官网:https://brew.sh/ 安装: 简介:https://www.jianshu.com/p/f4c9cf0733ea 比如,安装maven: 1、brew install maven 2、查看安装路径:brew list maven 具体参考:https://blog.csdn.net/m0_67402970/arti…

MPLS-LDP(个人学习笔记)

定义 标签分发协议LDP(Label Distribution Protocol)是多协议标签交换MPLS的一种控制协议,负责转发等价类FEC的分类、标签的分配以及标签交换路径LSP的建立和维护等操作。LDP规定了标签分发过程中的各种消息以及相关处理过程 术语 LDP会话&a…

【尚庭公寓SpringBoot + Vue 项目实战】移动端找房功能(二十一)

【尚庭公寓SpringBoot Vue 项目实战】移动端找房功能(二十一) 文章目录 【尚庭公寓SpringBoot Vue 项目实战】移动端找房功能(二十一)1、业务介绍2、接口开发2.1、地区信息2.2、获取全部支付方式列表2.3、房间信息2.2.1. 根据条…

python基础1.1-格式化输出(%用法和format用法)

目录 %用法 format用法 %用法 1、整数的输出 %o —— oct 八进制 %d —— dec 十进制 %x —— hex 十六进制 1 >>> print(%o % 20) 2 24 3 >>> print(%d % 20) 4 20 5 >>> print(%x % 20) 6 142、浮点数输出 (1)格式化…

鸿蒙开发系统基础能力:【@ohos.accessibility (辅助功能)】

辅助功能 说明: 本模块首批接口从 API version 7 开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import accessibility from ohos.accessibility;AbilityState 辅助应用状态类型。 系统能力:以下各项对应的…

智能体合集

海外版coze: 前端代码助手 后端代码助手: 前端代码助手:

添加右键菜单(以git为例)

1、打开注册表编辑器 打开系统注册表,使用组合键“Win R”输入“regedit”。 依次展开”HKEY_CLASSES_ROOT\Directory\Background\shell”。 2、新建右键菜单项 在[Background]下找到“shell”如果没有则新建项shell,接着在“shell”下右键-新建项名…

基于DPU的云原生裸金属网络解决方案

1. 方案背景和挑战 裸金属服务器是云上资源的重要部分,其网络需要与云上的虚拟机和容器互在同一个VPC下,并且能够像容器和虚拟机一样使用云的网络功能和能力。 传统的裸金属服务器使用开源的 OpenStack Ironic 组件,配合 OpenStack Neutron…

修改主频睡眠模式停止模式待机模式

代码示例: 接线图:修改主频 接线图:睡眠模式串口发送接收 CH340 USB转串口模块。GND和stm32共地。RXD接PA9,TXD接PA10。 接线图:停止模式对射式红外传感器计次 对射式红外传感器模块的VCC和GND接上供电。DO输出接S…

张大哥笔记:5种信息差赚钱模式

从古至今,赚钱最快的路子就一个,而且从未改变,那就是信息差!在商业活动中,信息不对称现象普遍存在,如果你善于利用这些信息差的话,就可以赚到钱! 1、价格的信息差 商品价格在不同地…

python pyautogui实现图片识别点击失败后重试

安装库 pip install Pillow pip install opencv-python confidence作用 confidence 参数是用于指定图像匹配的信度(或置信度)的,它表示图像匹配的准确程度。这个参数的值在 0 到 1 之间,数值越高表示匹配的要求越严格。 具体来…

ConcurrentHashMap(应对并发问题的工具类)

并发工具类 在JDK的并发包里提供了几个非常有用的并发容器和并发工具类。供我们在多线程开发中进行使用。 5.1 ConcurrentHashMap 5.1.1 概述以及基本使用 在集合类中HashMap是比较常用的集合对象,但是HashMap是线程不安全的(多线程环境下可能会存在问题)。为了…

可一件转化的视频生成模型:快手官方大模型“可灵”重磅来袭!

可一件转化的视频生成模型“可灵”重磅来袭! 前言 戴墨镜的蒙娜丽莎 达芬奇的画作《蒙娜丽莎的微笑》相信大家是在熟悉不过了,可《戴墨镜的蒙娜丽莎》大家是不是第一次见?而且这还不是以照片的形式,而是以视频的形式展示给大家。 …

Spring AOP实战--之优雅的统一打印web请求的出参和入参

背景介绍 由于实际项目内网开发,项目保密,因此本文以笔者自己搭建的demo做演示,方便大家理解。 在项目开发过程中,团队成员为了方便调试,经常会在方法的出口和入口处加上log输出,由于每个人的log需求和输…

奔驰EQS SUV升级原厂主动式氛围灯效果展示

以下是一篇关于奔驰 EQs 升级原厂主动氛围灯案例的宣传文案: 在汽车科技不断演进的今天,我们自豪地为您呈现奔驰 EQs 升级原厂主动氛围灯的精彩案例。 奔驰 EQs,作为豪华电动汽车的典范,其卓越品质与高端性能有目共睹。而此次升…

CVPR 2024盛况空前,上海科技大学夺得最佳学生论文奖,惊艳全场

CVPR 2024盛况空前!上海科技大学夺得最佳学生论文奖,惊艳全场! 会议之眼 快讯 2024 年 CVPR (Computer Vision and Pattern Recogntion Conference) 即国际计算机视觉与模式识别会议,于6月17日至21日正在美国西雅图召…

手把手教你java CPU飙升300%如何优化

背景 今天有个项目运行一段时间后,cpu老是不堪负载。 排查 top 命令 TOP 命令 top t 按cpu 排序 top m 按内存使用率排序 从上面看很快看出是 pid 4338 这个进程资源消耗很高。 top -Hp pid top -Hp 4338 找到对应线程消耗的资源shftp cpu占用进行排序&#xf…

【Java】已解决java.net.ProtocolException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.net.ProtocolException异常 在Java的网络编程中,java.net.ProtocolException异常通常表示在网络通信过程中,客户端或服务器违反了某种协议规则。…

计算机组成原理 | 计算机系统概述

CPI:(Clockcycle Per Instruction),指每条指令的时钟周期数。 时钟周期:对CPU来说,在一个时钟周期内,CPU仅完成一个最基本的动作。时钟脉冲是计算机的基本工作脉冲,控制着计算机的工作节奏。时钟周期 是一个时钟脉冲所…

除了百度,还有哪些搜索引擎工具可以使用

搜索引擎成是我们获取知识和信息不可或缺的工具。百度作为国内最大的搜索引擎,全球最大的中文搜索引擎,是许多人的首选。那么除了百度,还有哪些搜索引擎可以使用呢?小编就来和大家分享国内可以使用的其他搜索工具。 1. AI搜索 AI…