在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 06 Python
python使用urllib2提交http post请求的方法
May 26 Python
python Web开发你要理解的WSGI &amp; uwsgi详解
Aug 01 Python
一篇文章搞懂Python的类与对象名称空间
Dec 10 Python
Python 旋转打印各种矩形的方法
Jul 09 Python
python 实现提取log文件中的关键句子,并进行统计分析
Dec 24 Python
python 子类调用父类的构造函数实例
Mar 12 Python
python异常处理、自定义异常、断言原理与用法分析
Mar 23 Python
python3跳出一个循环的实例操作
Aug 18 Python
python使用建议技巧分享(三)
Aug 18 Python
python3通过subprocess模块调用脚本并和脚本交互的操作
Dec 05 Python
Python xlwings插入Excel图片的实现方法
Feb 26 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
Snoopy类使用小例子
2008/04/15 PHP
10个实用的PHP代码片段
2011/09/02 PHP
用 Composer构建自己的 PHP 框架之使用 ORM
2014/10/30 PHP
javascript 打印内容方法小结
2009/11/04 Javascript
js精度溢出解决方案
2012/12/02 Javascript
jquery遍历checkbox介绍
2014/02/21 Javascript
使用jquery动态加载js文件的方法
2014/12/24 Javascript
JavaScript中的Math.SQRT1_2属性使用简介
2015/06/14 Javascript
JS将滑动门改为选项卡(需鼠标点击)的实现方法
2015/09/27 Javascript
常用的JQuery函数及功能小结
2016/03/24 Javascript
jQuery获取radio选中项的值实例
2016/06/18 Javascript
javascript 注释代码的几种方法总结
2017/01/04 Javascript
走进javascript——不起眼的基础,值和分号
2017/02/24 Javascript
深入浅析ES6 Class 中的 super 关键字
2017/10/20 Javascript
vue鼠标移入添加class样式,鼠标移出去除样式(active)实现方法
2018/08/22 Javascript
vue父子模板传值问题解决方法案例分析
2020/02/26 Javascript
基于better-scroll 实现歌词联动功能的代码
2020/05/07 Javascript
Element图表初始大小及窗口自适应实现
2020/07/10 Javascript
关于Vue中$refs的探索浅析
2020/11/05 Javascript
详解JavaScript原型与原型链
2020/11/16 Javascript
[01:03:09]完美世界DOTA2联赛PWL S2 Forest vs SZ 第二场 11.25
2020/11/26 DOTA
详解Python中的__new__、__init__、__call__三个特殊方法
2016/06/02 Python
小小聊天室Python代码实现
2016/08/17 Python
python字符串str和字节数组相互转化方法
2017/03/18 Python
Python中标准模块importlib详解
2017/04/16 Python
高效测试用例组织算法pairwise之Python实现方法
2017/07/19 Python
python利用小波分析进行特征提取的实例
2019/01/09 Python
python将类似json的数据存储到MySQL中的实例
2019/07/12 Python
Python urllib3软件包的使用说明
2020/11/18 Python
CSS3中的5个有趣的新技术
2009/04/02 HTML / CSS
旅游管理专业学生求职信
2013/09/28 职场文书
优良学风班总结材料
2014/02/08 职场文书
2015年财务科工作总结范文
2015/05/13 职场文书
解决jupyter notebook图片显示模糊和保存清晰图片的操作
2021/04/24 Python
仅仅使用 HTML/CSS 实现各类进度条的方式汇总
2021/11/11 HTML / CSS
javascript中Set、Map、WeakSet、WeakMap区别
2022/12/24 Javascript