在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基本语法练习实例
Sep 19 Python
机器学习python实战之手写数字识别
Nov 01 Python
使用Python如何测试InnoDB与MyISAM的读写性能
Sep 18 Python
更新修改后的Python模块方法
Mar 03 Python
python super的使用方法及实例详解
Sep 25 Python
Python获取统计自己的qq群成员信息的方法
Nov 15 Python
python如何保存文本文件
Jun 07 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
Jan 26 Python
pycharm 的Structure界面设置操作
Feb 05 Python
解决pytorch下出现multi-target not supported at的一种可能原因
Feb 06 Python
解决pycharm 格式报错tabs和space不一致问题
Feb 26 Python
使用Python解决图表与画布的间距问题
Apr 11 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
超人钢铁侠联手合作?美漫作家呼吁DC漫威合作联动以抵抗疫情
2020/04/09 欧美动漫
PHP提取字符串中的图片地址[正则表达式]
2011/11/12 PHP
php删除数组元素示例分享
2014/02/17 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
2016/11/20 PHP
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
2012/12/27 Javascript
Nodejs+express+html5 实现拖拽上传
2014/08/08 NodeJs
JavaScript 异常处理 详解
2015/02/06 Javascript
jquery实现图片左右切换的方法
2015/05/07 Javascript
js中函数声明与函数表达式
2015/06/03 Javascript
JavaScript操作select元素和option的实例代码
2016/01/29 Javascript
JavaScript浮点数及运算精度调整详解
2016/10/21 Javascript
JS原生带小白点轮播图实例讲解
2017/07/22 Javascript
浅谈vue中慎用style的scoped属性
2017/11/28 Javascript
微信小程序实现文字无限轮播效果
2018/12/28 Javascript
vue动态绘制四分之三圆环图效果
2019/09/03 Javascript
JS实现iframe中子父页面跨域通讯的方法分析
2020/03/10 Javascript
Python Tkinter GUI编程入门介绍
2015/03/10 Python
介绍Python中几个常用的类方法
2015/04/08 Python
python开发之基于thread线程搜索本地文件的方法
2015/11/11 Python
python制作爬虫并将抓取结果保存到excel中
2016/04/06 Python
python模拟登录并且保持cookie的方法详解
2017/04/04 Python
Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
2017/07/24 Python
python监控键盘输入实例代码
2018/02/09 Python
对python中的pop函数和append函数详解
2018/05/04 Python
python tornado微信开发入门代码
2018/08/24 Python
python保存字典和读取字典的实例代码
2019/07/07 Python
python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法
2020/02/14 Python
python Canny边缘检测算法的实现
2020/04/24 Python
Python 执行矩阵与线性代数运算
2020/08/01 Python
.TTL是什么?有什么用处,通常那些工具会用到它?(ping? traceroute? ifconfig? netstat?)
2016/05/09 面试题
Servlet面试题库
2015/07/18 面试题
个人简历中的自我评价怎么写
2014/01/26 职场文书
党员批评与自我批评
2014/02/12 职场文书
团代会宣传工作方案
2014/05/08 职场文书
乡镇干部党的群众路线教育实践活动个人对照检查材料
2014/09/24 职场文书
2014年宣传部工作总结
2014/11/12 职场文书