在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的Django框架测试驱动开发的教程
Apr 22 Python
[原创]pip和pygal的安装实例教程
Dec 07 Python
Python爬虫中urllib库的进阶学习
Jan 05 Python
Django中日期处理注意事项与自定义时间格式转换详解
Aug 06 Python
python使用for循环计算0-100的整数的和方法
Feb 01 Python
keras模型可视化,层可视化及kernel可视化实例
Jan 24 Python
Django 后台带有字典的列表数据与页面js交互实例
Apr 03 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
May 10 Python
python连接mysql有哪些方法
Jun 24 Python
PyCharm配置anaconda环境的步骤详解
Jul 31 Python
Pygame Rect区域位置的使用(图文)
Nov 17 Python
Python超详细分步解析随机漫步
Mar 17 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模板中出现空行解决方法
2011/03/08 PHP
PHP读取配置文件类实例(可读取ini,yaml,xml等)
2015/07/28 PHP
php中使用websocket详解
2016/09/23 PHP
PHP静态成员变量和非静态成员变量详解
2017/02/14 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
jQuery仿Excel表格编辑功能的实现代码
2013/05/01 Javascript
浏览器打开层自动缓慢展开收缩实例代码
2013/07/04 Javascript
javascript计算星座属相(十二生肖属相)示例代码
2014/01/09 Javascript
JavaScript通过join函数连接数组里所有元素的方法
2015/03/20 Javascript
iscroll.js的上拉下拉刷新时无法回弹的解决方法
2016/02/18 Javascript
基于Vue.js实现数字拼图游戏
2016/08/02 Javascript
JS实现的tab切换选项卡效果示例
2017/02/28 Javascript
详解JavaScript数组过滤相同元素的5种方法
2017/05/23 Javascript
JS简单获取并修改input文本框内容的方法示例
2018/04/08 Javascript
jquery实现二级导航下拉菜单效果实例
2019/05/14 jQuery
基于Node.js的大文件分片上传示例
2019/06/19 Javascript
vue+koa2搭建mock数据环境的详细教程
2020/05/18 Javascript
微信小程序canvas动态时钟
2020/10/22 Javascript
python获取从命令行输入数字的方法
2015/04/29 Python
Python tkinter模块中类继承的三种方式分析
2017/08/08 Python
python 实现分页显示从es中获取的数据方法
2018/12/26 Python
浅析Python3 pip换源问题
2020/01/06 Python
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
2020/11/01 Python
实例教程 一款纯css3实现的数字统计游戏
2014/11/10 HTML / CSS
马来西亚银饰品牌:JEOEL
2017/12/15 全球购物
Pat McGrath Labs官网:世界上最有影响力的化妆师推出的彩妆品牌
2018/01/07 全球购物
River Island美国官网:英国高街时尚品牌
2018/09/04 全球购物
写好求职应聘自荐信的三部曲
2013/09/21 职场文书
无工作经验者个人求职信范文
2013/12/22 职场文书
高中生自我评语大全
2014/01/19 职场文书
我们的节日清明节活动总结
2014/04/30 职场文书
小学节能减排倡议书
2014/05/15 职场文书
普通党员群众路线教育实践活动心得体会
2014/11/04 职场文书
工程部部长岗位职责
2015/02/12 职场文书
六个好看实用的 HTML + CSS 后台登录入口页面
2022/04/28 HTML / CSS
关于MySQL中explain工具的使用
2023/05/08 MySQL