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

news2025/2/23 10:40:40

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

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] = 8
    j[: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 = 10
  modify_int(my_int)
  print(my_int)  # 输出 10

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

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

import copy

b = [[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 copy

b = [[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 copy

b = [[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 copy

b = [[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.coloradmin.cn/o/1847811.html

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

相关文章

淘宝扭蛋机小程序:互联网时代下行业的发展动力

近几年,扭蛋机在潮玩市场风靡,与各类IP合作,推出各种新颖有趣的扭蛋商品,吸引了众多的IP粉丝,他们会通过扭蛋机进行抽奖,获得喜欢的商品。 目前,移动应用程序不断升级优化,“互联网…

RGB彩色模型理解与编程实例

一、引言 RGB彩色模型中的R、G和B为三原色,通常R、G和B分别用8位表示,因此24位的RGB 真彩色图像能表示16777216种颜色。在如右图所示RGB彩色立方体可知,任意两种原色混合可以合成一种新的颜色。红(1,0,0&a…

番外篇 | YOLOv8算法解析和实战应用:车辆检测 + 车辆追踪 + 行驶速度计算

前言:Hello大家好,我是小哥谈。YOLOv8是ultralytics公司在2023年1月10号开源的,是YOLOv5的下一个重大更新版本,目前支持图像分类、物体检测和实例分割任务,在还没有开源时就收到了用户的广泛关注。它是一个SOTA模型,建立在以前YOLO版本的成功基础上,并引入了新的功能和改…

mock-前端数据模拟

简介 数据模拟不是开发流程中的必要一环 Json-server 简介: json-server 是一个简单的 Node.js 服务端应用程序,这个工具的主要作用是提供一个模拟的后端服务,可以在前端开发过程中独立于后端进行简单工作。 使用: 1、 安装…

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

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

基于强化学习的目标跟踪论文合集

文章目录 2020UAV Maneuvering Target Tracking in Uncertain Environments Based on Deep Reinforcement Learning and Meta-LearningUAV Target Tracking in Urban Environments Using Deep Reinforcement Learning 2021Research on Vehicle Dispatch Problem Based on Kuhn-…

【面试题】风险评估和应急响应的工作流程

风险评估和应急响应是网络安全管理中两个重要的环节。下面分别介绍它们的工作流程: 一、风险评估工作流程: 1.确定评估范围:明确需要评估的信息系统或资产的范围。 2.资产识别:识别并列出所有需要评估的资产,包括硬件…

【自动驾驶】运动底盘状态数据:里程计、IMU、运动学分析、串口通信协议

文章目录 控制器与运动底盘状态数据:里程计、IMU运动学分析与轮子运动学分析公式串口通信控制与反馈通讯协议串口通信反馈上行数据帧解析串口通信控制下行数据帧解析代码实现IMU、里程计数据的获取、解析、计算控制器与运动底盘状态数据:里程计、IMU 控制器需要负责外发底盘…

剑指offer 算法题(搜索二维矩阵)

剑指offer 第二题 去力扣里测试算法 思路一&#xff1a; 直接暴力遍历二维数组。 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {for (unsigned int i{ 0 }; i < matrix.size(); i){for (unsigned int j{ 0 };…

ASP.NET Core 6.0 使用 Log4Net 和 Nlog日志中间件

前言 两年前,浅浅的学过 .NET 6,为啥要记录下来,大概是为了以后搭架子留下引线,还有抛砖引玉。 1. 环境准备 下载 建议使用 Visual Studio 2022 开发版 官网的下载地址:Visual Studio 2022 IDE - 适用于软件开发人员的编程工具借助 Visual Studio 设计,具有自动完成…

Word中删除空白页

① 文字后面出现的空白页 把鼠标放在空白页的位置&#xff0c;按住Ctrl Delete即可。 ② 表格后面的空白页 把鼠标放在空白页左侧&#xff0c;直到出现一个空白的箭头&#xff0c;点击一下选中空白页&#xff0c;然后再Ctrl D&#xff0c;打开字体选项卡&#xff0c;在效果中…

智能体合集

海外版coze: 前端代码助手 后端代码助手&#xff1a; 前端代码助手&#xff1a;

【shell脚本速成】函数

文章目录 一、函数1.1、函数介绍1.2、函数定义1.3、函数调用 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f388;欢迎踏入我的博客世界&#xff0c;能与您在此邂逅&#xff0c;真是缘分使然&#xff01;&#x1f60a; &#x1f338;愿您在此停留的每一刻&#xf…

鸿蒙开发通信与连接:【@ohos.wifiext (WLAN)】

WLAN 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 该文档中的接口只供非通用类型产品使用&#xff0c;如路由器等&#xff0c;对于常规类型产品&#xff0c;不应该使用这些接口。 导入模块 …

自动备份SQL Server数据库,试试这4种方法!

各种规模的企业都使用 SQL 数据库来存储数据。因此&#xff0c;备份 SQL Server 数据库对于确保数据安全并在发生灾难时可恢复至关重要。对于 SQL 数据库备份&#xff0c;有多种可行的方法&#xff0c;对于特定组织来说&#xff0c;方法将取决于其具体需求。 SQL Server 备份的…

java:Multiple Bounds--类型变量(TypeVariable)定义的高级用法--<A extends ClassAIfAIfB >

做Java开发工作好多年了。今天偶然翻到 java.lang.TypeVariable的源码&#xff0c;好奇为什么 TypeVariable.getBounds()返回类型是个数组。 一般不都是<T extends Number> 这样用码&#xff1f;T难道还能extends多个类型&#xff1f; 同问&#xff1a;不应该是extend,为…

基于Pytorch框架的深度学习Vision Transformer神经网络蝴蝶分类识别系统源码

第一步&#xff1a;准备数据 6种蝴蝶数据&#xff1a;self.class_indict ["曙凤蝶", "麝凤蝶", "多姿麝凤蝶", "旖凤蝶", "红珠凤蝶", "热斑凤蝶"]&#xff0c;总共有900张图片&#xff0c;每个文件夹单独放一种…

重磅!2024年最新影响因子正式发布,附Excel下载

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 激动人心的时刻终于来了&#xff0c;2024年影响因子已全面发布&#xff01;废话不多说&#xff0c;大家一起来看看最新的发布的结果吧&#xff01; 神刊&#xff1a;CA-A CANCER JOURNA…

go-admin-ui开源后台管理系统华为云部署

1.华为云开通8000与9527端口 2.编译 编译成功 3.发布到远程服务器 4.登陆华为云终端 5.安装Nginx 6.查看服务启动状态 7.添加网站 添加与修改配置www-data 改为 www 自定义日志输出格式 添加网站配置文件go_admin_ui.conf 添加如下内容: location 下的root指向网站文件夹 修…

java实现图片水印添加并自动上传七牛云

图片左下角水印添加 满足需求&#xff1a;可以对不同类型尺寸的照片、图片进行水印的添加&#xff0c;实现尺寸自适应添加水印。 水印效果 代码实现 Controller package com.wlh.zetc.restore.controller;import cn.hutool.core.date.DateUtil; import com.alibaba.nacos.c…