在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 14 Python
Python连接phoenix的方法示例
Sep 29 Python
python实现定时自动备份文件到其他主机的实例代码
Feb 23 Python
python 读取.csv文件数据到数组(矩阵)的实例讲解
Jun 14 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
Dec 15 Python
线程安全及Python中的GIL原理分析
Oct 29 Python
TensorFlow tf.nn.conv2d实现卷积的方式
Jan 03 Python
python numpy--数组的组合和分割实例
Feb 24 Python
PyTorch: Softmax多分类实战操作
Jul 07 Python
python基于pygame实现飞机大作战小游戏
Nov 19 Python
Python3.8.2安装包及安装教程图文详解(附安装包)
Nov 28 Python
Django2.1.7 查询数据返回json格式的实现
Dec 29 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
NOT NULL 和NULL
2007/01/15 PHP
php中运用http调用的GET和POST方法示例
2014/09/29 PHP
ThinkPHP模板之变量输出、自定义函数与判断语句用法
2014/11/01 PHP
浅谈PHP中单引号和双引号到底有啥区别呢?
2015/03/04 PHP
php使用函数pathinfo()、parse_url()和basename()解析URL
2016/11/25 PHP
Laravel使用原生sql语句并调用的方法
2019/10/09 PHP
syntaxhighlighter 使用方法
2007/07/02 Javascript
js防止表单重复提交的两种方法
2013/09/30 Javascript
浅析jQuery(function(){})与(function(){})(jQuery)之间的区别
2014/01/09 Javascript
javascript实现类似超链接的效果
2014/12/26 Javascript
jQuery中:last选择器用法实例
2014/12/30 Javascript
JavaScript中匿名函数用法实例
2015/03/23 Javascript
JS使用eval解析JSON的注意事项分析
2015/11/14 Javascript
javascript for-in有序遍历json数据并探讨各个浏览器差异
2015/11/30 Javascript
Ionic实现仿通讯录点击滑动及$ionicscrolldelegate使用分析
2016/01/18 Javascript
对象转换为原始值的实现方法
2016/06/06 Javascript
axios post提交formdata的实例
2018/03/16 Javascript
create-react-app 修改为多入口编译的方法
2018/08/01 Javascript
Electron autoUpdater实现Windows安装包自动更新的方法
2018/12/24 Javascript
JavaScript异步操作的几种常见处理方法实例总结
2020/05/11 Javascript
Node登录权限验证token验证实现的方法示例
2020/05/25 Javascript
微信小程序实现电子签名并导出图片
2020/05/27 Javascript
解决vue加scoped后就无法修改vant的UI组件的样式问题
2020/09/07 Javascript
Python正则表达式匹配HTML页面编码
2015/04/08 Python
Python Matplotlib库入门指南
2015/05/18 Python
Python 记录日志的灵活性和可配置性介绍
2018/02/27 Python
Pandas_cum累积计算和rolling滚动计算的用法详解
2019/07/04 Python
使用keras实现densenet和Xception的模型融合
2020/05/23 Python
HTML5应用之文件上传
2016/12/30 HTML / CSS
html5 CSS过度-webkit-transition使用介绍
2013/07/02 HTML / CSS
生日礼品店创业计划书范文
2014/03/21 职场文书
租房协议书范本
2014/04/09 职场文书
服务行业演讲稿
2014/09/02 职场文书
财务工作犯错检讨书
2014/10/07 职场文书
五年级上册复习计划
2015/01/19 职场文书
医院保洁员管理制度
2015/08/05 职场文书