(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…

日语 13 14

13. スピーチの依頼 いらい 自信 自信 自信 自信 自信 じしん 折り入って 折り入って 折り入って おりいって  诚恳 頼み 頼み 頼み 頼み 頼み  たのみ 请求 整備 整備 整備 整備 整備 せいび 维修 肥満 肥満 肥満 肥満 肥満 ひまん 肥胖 権利 …

jigdo无法下载的文件

问题描述 用jigdo下载Debian的iso镜像,剩下最后一个文件下载不了,提示信息: Found 0 of the 1 files required by the template Copied input files to temporary file debian-12.5.0-amd64-DLBD-2.iso.tmp - repeat command and supply mo…

torch.max函数

torch.max函数的用法 第一种第二种 官方介绍:Link 有两种使用场景,输入的参数不同以及返回值不同: 第一种 没有参数dim,但这种只适合一维张量。 torch.max(input) → Tensor Returns the maximum value of all elements in the…

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: 前端代码助手 后端代码助手: 前端代码助手:

glXMakeCurrent 退出

glXMakeCurrent 退出 X Error of failed request: GLXBadDrawable Major opcode of failed request: 146 (GLX) Minor opcode of failed request: 29 (X_GLXGetDrawableAttributes) Serial number of failed request: 90 Current serial number in output stream: …

优惠券核销业务

优惠券核销业务,包含 买券,券核销,退券,退款,过期自动退。 优惠券 为了促销,商家有时会发放一些优惠券,比如 80 抵 100。抖音、美团,都有类似的业务。 购买优惠券 优惠券&#x…

C++核心编程运算符的重载

C核心编程运算符的重载 文章目录 C核心编程运算符的重载1.“”运算符的重载1.1 作为成员函数重载1.2 作为全局函数重载 2."<<"运算符重载2.1为什么需要重载左移运算符2.2如何重载左移运算符2.3注意事项 3.""运算符重载3.1 前置递增运算符重载3.2后置…

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

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

算法训练营day66-孤岛总面积-沉没孤岛-水流问题-建造最大岛屿

题目1&#xff1a;101. 孤岛的总面积 (kamacoder.com) #include <iostream> #include <vector> #include <queue> using namespace std; int dir[4][2] {0,-1,-1,0,0,1,1,0}; int count 0; void bfs(vector<vector<int>>& map, vector<…

智能农业管理系统设计

一、引言 随着物联网、云计算和大数据技术的快速发展&#xff0c;智能农业管理系统成为提高农业生产效率、优化资源配置、降低环境污染的重要手段。本设计旨在构建一个集数据采集、传输、处理、分析于一体的智能农业管理系统&#xff0c;为农业生产提供全方位、精准化的服务。 …

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

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

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

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

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

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

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

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

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

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