在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启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)
Apr 09 Python
python的绘图工具matplotlib使用实例
Jul 03 Python
Python中的hypot()方法使用简介
May 18 Python
Python调用adb命令实现对多台设备同时进行reboot的方法
Oct 15 Python
python版飞机大战代码分享
Nov 20 Python
django富文本编辑器的实现示例
Apr 10 Python
解决Django加载静态资源失败的问题
Jul 28 Python
Django单元测试中Fixtures用法详解
Feb 25 Python
关于matplotlib-legend 位置属性 loc 使用说明
May 16 Python
Python使用Selenium模拟浏览器自动操作功能
Sep 08 Python
selenium携带cookies模拟登陆CSDN的实现
Jan 19 Python
 python中的元类metaclass详情
May 30 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
PHP获取MAC地址的函数代码
2011/09/11 PHP
php中3des加密代码(完全与.net中的兼容)
2012/08/02 PHP
php事务处理实例详解
2014/07/11 PHP
PHP正则获取页面所有图片地址
2016/03/23 PHP
实例讲解PHP验证邮箱是否合格
2019/01/28 PHP
jquery 图片Silhouette Fadeins渐显效果
2010/02/07 Javascript
基于jquery的超简单上下翻
2010/04/20 Javascript
SlideView 图片滑动(扩展/收缩)展示效果
2010/08/01 Javascript
用js判断页面是否加载完成实现代码
2012/12/11 Javascript
网页右侧悬浮滚动在线qq客服代码示例
2014/04/28 Javascript
基于jquery实现等比缩放图片
2014/12/03 Javascript
js使用心得分享
2015/01/13 Javascript
jQuery Easyui实现左右布局
2016/01/26 Javascript
基于vue实现分页/翻页组件paginator示例
2017/03/09 Javascript
JQuery 获取多个select标签option的text内容(实例)
2017/09/07 jQuery
Node.js学习之查询字符串解析querystring详解
2017/09/28 Javascript
JavaScript一元正号运算符示例代码
2019/06/30 Javascript
vue cli 3.0通用打包配置代码,不分一二级目录
2020/09/02 Javascript
[48:52]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第一局
2016/02/25 DOTA
[37:50]VP vs TNC Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
python获取多线程及子线程的返回值
2017/11/15 Python
python中csv文件的若干读写方法小结
2018/07/04 Python
TensorFlow用expand_dim()来增加维度的方法
2018/07/26 Python
详解通过API管理或定制开发ECS实例
2018/09/30 Python
对python中dict和json的区别详解
2018/12/18 Python
python 叠加等边三角形的绘制的实现
2019/08/14 Python
完美解决Django2.0中models下的ForeignKey()问题
2020/05/19 Python
CSS3样式linear-gradient的使用实例
2017/01/16 HTML / CSS
护理自荐信范文
2013/10/05 职场文书
中学实习教师自我鉴定
2013/12/12 职场文书
私人委托书格式
2014/09/10 职场文书
王亚平太空授课观后感
2015/06/12 职场文书
学校趣味运动会开幕词
2016/03/04 职场文书
写给医护人员的一封感谢信
2019/09/16 职场文书
如何用Node.js编写内存效率高的应用程序
2021/04/30 Javascript
python3 字符串str和bytes相互转换
2022/03/23 Python