在python中list作函数形参,防止被实参修改的实现方法


Posted in Python onJune 05, 2020

0.摘要

我们将一个list传入函数后,函数内部对实参修改后,形参也会随之改变。本文将主要介绍这种错误的现象、原因和解决方法。

1.代码示例

def fun(inner_lst):
  inner_lst.pop()
 
lst = [1,2,3,4,5,6,7]
fun(lst)
print(lst)
fun(lst)
print(lst)
fun(lst)
print(lst)
fun(lst)
print(lst)
fun(lst)
print(lst)

在python中list作函数形参,防止被实参修改的实现方法

从运行结果上,可以看出,

虽然我们改变的是fun()内部的inner_lst,但是,外部的lst也随之改变了。

因此,如果我们将一个列表传入一个函数的,运行这个函数,可能会破坏我们的原始数据,这可能并不是我们想要看到的。

2.原因

首先,我们解释一下上面这种情况的原因。

在python中,数据有两种类型:mutable(可变) 和 immutable (不可变)

list ,dict是mutable的;

int , string , float ,tuple是inmutable 的。

在函数参数的传递过程中:

对于inmutable object ,函数参数传递是值

对于mutable object,函数参数传递是指针

因此,当我们把lst传入fun()函数时,实际是把lst的指针传递给了inner_lst变量。

所以,lst的值会随着inner_lst进行变化。

3.解决

如果我们传入函数的形参是一个list变量,那么我们需要先拷贝一份,之后的操作在备份上进行,这样便不会破坏原始数据。

比如:

def fun(inner_lst):
  lst_copy = inner_lst.copy()
  lst_copy.pop()
  print("lst_copy = ",lst_copy)
lst = [1,2,3,4,5,6,7]
fun(lst)
print("lst = ",lst)

在python中list作函数形参,防止被实参修改的实现方法

补充知识:Python 函数参数List 形参改变实参问题

在学习Python 中的排序中,发现一个问题,写的排序函数会改变实参中的原List,不方便,我做对比,经过查询和学习,总结如下:

List 改变某一项值,会改变实参。

整体从新赋值,不会改变实参。

原因为形参和实参这两个标签指向的都是同样的一块列表。改变其中一个另一个也就跟着改变了。

解决方法如下可在参数中加:

在函数中复制一个List,在新的List中进行排序。

def selectionSort(xx):
  x=xx[:]
  i = 0
  while i < len(x) - 1:
    j = i + 1
    minindex = i
    while j < len(x):
      if x[minindex] > x[j]:
        minindex = j
      j += 1
    x[minindex], x[i] = x[i], x[minindex]
    i += 1
  return x

以上这篇在python中list作函数形参,防止被实参修改的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python访问系统环境变量的方法
Apr 29 Python
Python使用正则表达式过滤或替换HTML标签的方法详解
Sep 25 Python
Python爬取附近餐馆信息代码示例
Dec 09 Python
python文件拆分与重组实例
Dec 10 Python
pytorch permute维度转换方法
Dec 14 Python
Python实现删除排序数组中重复项的两种方法示例
Jan 31 Python
Python字符串内置函数功能与用法总结
Apr 16 Python
python 反编译exe文件为py文件的实例代码
Jun 27 Python
Python RabbitMQ实现简单的进程间通信示例
Jul 02 Python
详解Python直接赋值,深拷贝和浅拷贝
Jul 09 Python
python中复数的共轭复数知识点总结
Dec 06 Python
pip/anaconda修改镜像源,加快python模块安装速度的操作
Mar 04 Python
pycharm远程连接vagrant虚拟机中mariadb数据库
Jun 05 #Python
浅谈python 调用open()打开文件时路径出错的原因
Jun 05 #Python
Python命名空间namespace及作用域原理解析
Jun 05 #Python
Python3内置函数chr和ord实现进制转换
Jun 05 #Python
Python 解决相对路径问题:&quot;No such file or directory&quot;
Jun 05 #Python
opencv之颜色过滤只留下图片中的红色区域操作
Jun 05 #Python
Python参数传递及收集机制原理解析
Jun 05 #Python
You might like
ThinkPHP实现ajax仿官网搜索功能实例
2014/12/02 PHP
php项目中百度 UEditor 简单安装调试和调用
2015/07/15 PHP
PHP设计模式之装饰器模式实例详解
2018/02/07 PHP
PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】
2018/04/27 PHP
在laravel框架中实现封装公共方法全局调用
2019/10/14 PHP
解决AJAX中跨域访问出现'没有权限'的错误
2008/08/20 Javascript
jQuery 事件的命名空间简单了解
2013/11/22 Javascript
javascript自定义滚动条实现代码
2020/04/20 Javascript
JavaScript Ajax编程 应用篇
2016/07/02 Javascript
详解jQuery插件开发方式
2016/11/22 Javascript
如何解决jQuery EasyUI 已打开Tab重新加载问题
2016/12/19 Javascript
Angular搜索 过滤 批量删除 添加 表单验证功能集锦(实例代码)
2017/10/25 Javascript
详解vue2.0+vue-video-player实现hls播放全过程
2018/03/02 Javascript
NodeJS安装图文教程
2018/04/19 NodeJs
JavaScript引用类型Date常见用法实例分析
2018/08/08 Javascript
JavaScript设计模式之装饰者模式实例详解
2019/01/17 Javascript
JS如何在不同平台实现多语言方式
2020/07/16 Javascript
JS typeof fn === 'function' &amp;&amp; fn()详解
2020/08/22 Javascript
[41:11]完美世界DOTA2联赛PWL S2 Inki vs Magma 第一场 11.22
2020/11/24 DOTA
python处理二进制数据的方法
2015/06/03 Python
python 筛选数据集中列中value长度大于20的数据集方法
2018/06/14 Python
python+opencv 读取文件夹下的所有图像并批量保存ROI的方法
2019/01/10 Python
使用Windows批处理和WMI设置Python的环境变量方法
2019/08/14 Python
一文读懂Python 枚举
2020/08/25 Python
使用Pytorch搭建模型的步骤
2020/11/16 Python
PyTorch预训练Bert模型的示例
2020/11/17 Python
html5的canvas实现3d雪花飘舞效果
2013/12/27 HTML / CSS
Marmot土拨鼠官网:美国专业户外运动品牌
2018/01/11 全球购物
Booking.com英国官网:全球酒店在线预订网站
2018/04/21 全球购物
俄罗斯卫浴采暖及维修用品超级市场:Dkrussia
2020/05/12 全球购物
房地产广告词大全
2014/03/19 职场文书
校园绿化美化方案
2014/06/08 职场文书
单位在职证明书
2014/09/11 职场文书
人事文员岗位职责
2015/02/04 职场文书
农业项目投资意向书
2015/05/09 职场文书
Java+swing实现抖音上的表白程序详解
2022/06/25 Java/Android