在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下的Mysql模块MySQLdb安装详解
Apr 09 Python
对于Python的Django框架部署的一些建议
Apr 09 Python
Windows下搭建python开发环境详细步骤
Jul 20 Python
解决pandas使用read_csv()读取文件遇到的问题
Jun 15 Python
python 移除字符串尾部的数字方法
Jul 17 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
Jul 19 Python
python实战串口助手_解决8串口多个发送的问题
Jun 12 Python
python原类、类的创建过程与方法详解
Jul 19 Python
Python 根据日志级别打印不同颜色的日志的方法示例
Aug 08 Python
Python for循环通过序列索引迭代过程解析
Feb 07 Python
利用Python批量识别电子账单数据的方法
Feb 08 Python
python实现简单区块链结构
Apr 25 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缓存机制Output Control详解
2014/07/14 PHP
php从文件夹随机读取文件的方法
2015/06/01 PHP
Yii框架核心组件类实例详解
2019/08/06 PHP
PHP实现笛卡尔积算法的实例讲解
2019/12/22 PHP
又一个图片自动缩小的JS代码
2007/03/10 Javascript
jquery学习笔记二 实现可编辑的表格
2010/04/09 Javascript
JavaScript 函数惰性载入的实现及其优点介绍
2013/08/12 Javascript
jquery ajax 局部无刷新更新数据的实现案例
2014/02/08 Javascript
Javascript Objects详解
2014/09/04 Javascript
使用impress.js制作幻灯片
2015/09/09 Javascript
jquery 实现输入邮箱时自动补全下拉提示功能
2015/10/04 Javascript
JavaScript的Ext JS框架中的GridPanel组件使用指南
2016/05/21 Javascript
使用JavaScript获取Request中参数的值方法
2016/09/27 Javascript
微信小程序 条件渲染详解
2016/10/09 Javascript
JS表单验证方法实例小结【电话、身份证号、Email、中文、特殊字符、身份证号等】
2017/02/14 Javascript
详解nodejs中express搭建权限管理系统
2017/09/15 NodeJs
Vue项目自动转换 px 为 rem的实现方法
2018/10/29 Javascript
微信小程序实现评论功能
2018/11/28 Javascript
Node.js实现简单管理系统
2019/09/23 Javascript
layui form表单提交后实现自动刷新
2019/10/25 Javascript
JS实现随机抽选获奖者
2019/11/07 Javascript
[46:32]Fnatic vs OG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Web服务器框架 Tornado简介
2014/07/16 Python
Python中将字典转换为列表的方法
2016/09/21 Python
目前最全的python的就业方向
2018/06/05 Python
解决python3捕获cx_oracle抛出的异常错误问题
2018/10/18 Python
python Tkinter版学生管理系统
2019/02/20 Python
html5实现的便签特效(实战分享)
2013/11/29 HTML / CSS
boostrap modal 闪现问题的解决方法
2020/09/01 HTML / CSS
毕业生自荐书模版
2014/01/04 职场文书
《美丽的小路》教学反思
2014/02/26 职场文书
事业单位分类改革实施方案
2014/03/21 职场文书
书香校园建设方案
2014/05/02 职场文书
学习三严三实对照检查材料思想汇报
2014/09/22 职场文书
银行授权委托书范本
2014/10/04 职场文书
Golang map映射的用法
2022/04/22 Golang