在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实现国外赌场热门游戏Craps(双骰子)
Mar 31 Python
python定时器(Timer)用法简单实例
Jun 04 Python
Python解析树及树的遍历
Feb 03 Python
利用pyinstaller或virtualenv将python程序打包详解
Mar 22 Python
python 3.5下xadmin的使用及修复源码bug
May 10 Python
python 读取txt中每行数据,并且保存到excel中的实例
Apr 29 Python
对python当中不在本路径的py文件的引用详解
Dec 15 Python
Python3 合并二叉树的实现
Sep 30 Python
使用Tensorflow实现可视化中间层和卷积层
Jan 24 Python
Keras loss函数剖析
Jul 06 Python
opencv 图像礼帽和图像黑帽的实现
Jul 07 Python
python中Pexpect的工作流程实例讲解
Mar 02 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
1 Tube Radio
2021/03/02 无线电
PHP 删除一个目录及目录下的所有文件的函数代码
2010/05/26 PHP
深入php多态的实现详解
2013/06/09 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
2016/09/11 PHP
php strftime函数获取日期时间(switch用法)
2018/05/16 PHP
基于jQuery的合并表格中相同文本的相邻单元格的代码
2011/04/06 Javascript
jqgrid 表格数据导出实例
2013/11/21 Javascript
JavaScript中对循环语句的优化技巧深入探讨
2014/06/06 Javascript
使用开源工具制作网页验证码的方法
2016/10/17 Javascript
JavaScript 中的 this 简单规则
2017/09/19 Javascript
Vue导出json数据到Excel电子表格的示例
2017/12/04 Javascript
vue.js使用代理和使用Nginx来解决跨域的问题
2018/02/03 Javascript
解决layui上传文件提示上传异常,实际文件已经上传成功的问题
2018/08/19 Javascript
JavaScript中的&quot;=、==、===&quot;区别讲解
2019/01/22 Javascript
使用JavaScript保存文本文件到本地的两种方法
2019/01/22 Javascript
js实现div色块碰撞
2020/01/16 Javascript
vue实现几秒后跳转新页面代码
2020/09/09 Javascript
Python 不同对象比较大小示例探讨
2014/08/21 Python
Python判断变量是否为Json格式的字符串示例
2017/05/03 Python
TensorFlow 模型载入方法汇总(小结)
2018/06/19 Python
python实现狄克斯特拉算法
2019/01/17 Python
利用python中集合的唯一性实现去重
2020/02/11 Python
Python基础之字典常见操作经典实例详解
2020/02/26 Python
Python类中的装饰器在当前类中的声明与调用详解
2020/04/15 Python
使用css3制作动感导航条示例
2014/01/26 HTML / CSS
AVON雅芳官网:世界上最大的美容化妆品公司之一
2016/11/02 全球购物
英国最大的高品质珠宝和手表专家:Goldsmiths
2017/03/11 全球购物
Maisons du Monde德国:法国家具和装饰的市场领导者
2019/07/26 全球购物
商业活动邀请函
2014/02/04 职场文书
运动会通讯稿150字
2014/02/15 职场文书
作文评语大全
2014/04/23 职场文书
销售区域经理岗位职责
2015/04/10 职场文书
525心理健康活动总结
2015/05/08 职场文书
《司马光》教学反思
2016/02/22 职场文书
阿里云 Windows server 2019 配置FTP
2022/04/28 Servers