当前位置: 首页 > news >正文

Python for循环中的引用传递和值传递

先上代码:

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的值的修改,这是为什么呢?

引用传递和值传递

引用传递(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 中,变量的赋值行为遵循以下规则:
对于可变对象,变量存储的是对象的引用,即引用传递。
对于不可变对象,变量存储的是对象的值,即值传递。

对一开始的问题做出简化

a = [[1],[2],[3]]
b = [[4,5],[6,7],[7,8]]
c = a
c[0]=[8]
print(a)

这个c按理说是a的一个副本,但是为什么对c修改会对a造成影响呢?

当我们执行 c = a时,c 并不是 a 的副本,而是指向了 a 中同样的列表对象。也就是说,a 和 c 指向的是同一块内存地址。

然后当我们执行 c[0] = [8] 时,我们是在修改 c 指向的那个列表的第一个元素。但是由于 a 和 c 指向的是同一个列表对象,所以这个修改同时也影响到了 a。

这就是为什么打印 a 的结果会变成 [[8], [2], [3]]。

如果你想创建 a的副本,而不是让 c 指向同一个列表对象,可以使用以下方式:

a = [[1], [2], [3]]
b = [[4, 5], [6, 7], [7, 8]]
c = a[:]  # 或者 c=copy.copy(a) 或 c = copy.deepcopy(a)
c[0] = [8]
print(a)  # 输出 [[1], [2], [3]]
print(c)  # 输出 [[8], [2], [3]]

在最开始的问题中

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)

相关文章:

  • Redis 面试热点(二)
  • 每日一练:攻防世界:Ditf
  • Golang并发控制的三种方案
  • 一文理清GO语言日志库实现开发项目中的日志功能(rotatelogs/zap分析)
  • 基于多头注意力机制卷积神经网络结合双向门控单元CNN-BIGRU-Mutilhead-Attention实现柴油机故障诊断附matlab代码
  • MongoDB~高可用集群介绍:复制集群(副本集)、分片集群
  • SQL MAX() 函数深入解析
  • PyQt5设计登录跳转界面
  • 使用net.sf.mpxj读取project的.mpp文件
  • 文件操作(2)(C语言版)
  • Tuple 元组
  • MAX30102驱动
  • 【ajax基础03】常用ajax请求方法和数据提交以及axios错误处理
  • Java23种设计模式(二)
  • MySQL系列-语法说明以及基本操作(二)
  • [LeetCode] Wiggle Sort
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • express.js的介绍及使用
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • jquery cookie
  • Lucene解析 - 基本概念
  • Node 版本管理
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • - 概述 - 《设计模式(极简c++版)》
  • 力扣(LeetCode)56
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • Java数据解析之JSON
  • 第二十章:异步和文件I/O.(二十三)
  • ​卜东波研究员:高观点下的少儿计算思维
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (多级缓存)缓存同步
  • (二十三)Flask之高频面试点
  • (南京观海微电子)——COF介绍
  • (四)鸿鹄云架构一服务注册中心
  • (转)fock函数详解
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (轉貼) UML中文FAQ (OO) (UML)
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .bat文件调用java类的main方法
  • .Net Web窗口页属性
  • .NET 反射的使用
  • .NET/C# 的字符串暂存池
  • .NET下的多线程编程—1-线程机制概述
  • :=
  • @GlobalLock注解作用与原理解析
  • @Not - Empty-Null-Blank
  • @软考考生,这份软考高分攻略你须知道
  • [15] 使用Opencv_CUDA 模块实现基本计算机视觉程序
  • [20140403]查询是否产生日志
  • [2018-01-08] Python强化周的第一天
  • [20190401]关于semtimedop函数调用.txt
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...
  • [AHOI2009]中国象棋 DP,递推,组合数