在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性能优化技巧
Mar 09 Python
Python多线程、异步+多进程爬虫实现代码
Feb 17 Python
python实现八大排序算法(1)
Sep 14 Python
Python面向对象编程之继承与多态详解
Jan 16 Python
python如何创建TCP服务端和客户端
Aug 26 Python
Django 反向生成url实例详解
Jul 30 Python
Python三元运算与lambda表达式实例解析
Nov 30 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
Feb 17 Python
django实现HttpResponse返回json数据为中文
Mar 27 Python
Opencv求取连通区域重心实例
Jun 04 Python
浅析Python 抽象工厂模式的优缺点
Jul 13 Python
如何一键升级Python所有包
Nov 05 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
基于mysql的论坛(5)
2006/10/09 PHP
第六节--访问属性和方法
2006/11/16 PHP
Windows下安装Memcached的步骤说明
2010/04/25 PHP
一些PHP Coding Tips(php小技巧)[2011/04/02最后更新]
2011/05/02 PHP
解析php session_set_save_handler 函数的用法(mysql)
2013/06/29 PHP
从PHP $_SERVER相关参数判断是否支持Rewrite模块
2013/09/26 PHP
PHP面向对象程序设计之类常量用法实例
2014/08/20 PHP
实现超用户体验 table排序javascript实现代码
2009/06/22 Javascript
用jquery的方法制作一个简单的导航栏
2014/06/23 Javascript
javascript动画算法实例分析
2015/07/31 Javascript
jQuery实现点击后标记当前菜单位置(背景高亮菜单)效果
2015/08/22 Javascript
js父页面中使用子页面的方法
2016/01/09 Javascript
js改变style样式和css样式的简单实例
2016/06/28 Javascript
javascript 将共享属性迁移到原型中去的实现方法
2016/08/31 Javascript
bootstrap选项卡扩展功能详解
2017/06/14 Javascript
js CSS3实现卡牌旋转切换效果
2017/07/04 Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
2017/10/17 Javascript
JS面试题大坑之隐式类型转换实例代码
2018/10/14 Javascript
Vant的安装和配合引入Vue.js项目里的方法步骤
2018/12/05 Javascript
[38:32]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第二局
2016/02/26 DOTA
django在接受post请求时显示403forbidden实例解析
2018/01/25 Python
解决Python requests库编码 socks5代理的问题
2018/05/07 Python
基于python3抓取pinpoint应用信息入库
2020/01/08 Python
html5教程实现Photoshop渐变色效果
2013/12/04 HTML / CSS
Funko官方商店:源自美国,畅销全球搪胶收藏玩偶
2018/09/15 全球购物
运动鞋、足球鞋和慕尼黑球衣:Sport Münzinger
2019/08/26 全球购物
Weblogc domain问题
2014/01/27 面试题
高三毕业生自我鉴定
2013/12/20 职场文书
反腐倡廉演讲稿
2014/05/22 职场文书
学生逃课检讨书1000字
2014/10/20 职场文书
开幕式邀请函
2015/01/31 职场文书
舞蹈社团活动总结
2015/05/07 职场文书
优秀共产党员事迹材料2016
2016/02/29 职场文书
某学校的2019年度工作报告范本
2019/10/11 职场文书
Android自定义ScrollView实现阻尼回弹
2022/04/01 Java/Android
Python字符串的转义字符
2022/04/07 Python