在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中文编码那些事
Jun 25 Python
介绍Python中的fabs()方法的使用
May 14 Python
Python保存MongoDB上的文件到本地的方法
Mar 16 Python
[原创]windows下Anaconda的安装与配置正解(Anaconda入门教程)
Apr 05 Python
Python实现绘制双柱状图并显示数值功能示例
Jun 23 Python
python实现俄罗斯方块
Jun 26 Python
opencv导入头文件时报错#include的解决方法
Jul 31 Python
Python安装及Pycharm安装使用教程图解
Sep 20 Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
Feb 10 Python
Python Tkinter Entry和Text的添加与使用详解
Mar 04 Python
Python分类测试代码实例汇总
Jul 23 Python
在pycharm中使用pipenv创建虚拟环境和安装django的详细教程
Nov 30 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中json_decode()和json_encode()的使用方法
2012/06/04 PHP
PHP实现Redis单据锁以及防止并发重复写入
2018/04/10 PHP
php语法检查的方法总结
2019/01/21 PHP
jQuery 浮动广告实现代码
2008/12/25 Javascript
JS用斜率判断鼠标进入DIV四个方向的方法
2016/11/07 Javascript
深入理解Javascript中的观察者模式
2017/02/20 Javascript
jQuery插件zTree实现删除树节点的方法示例
2017/03/08 Javascript
如何快速解决JS或Jquery ajax异步跨域的问题
2018/01/08 jQuery
Vue 实现对quill-editor组件中的工具栏添加title
2020/08/03 Javascript
手写Vue源码之数据劫持示例详解
2021/01/04 Vue.js
js删除指定位置超链接中含有百度与360的标题
2021/01/06 Javascript
[00:47]DOTA2荣耀之路6:天火,天火!
2018/05/30 DOTA
python爬取网站数据保存使用的方法
2013/11/20 Python
使用Python脚本来控制Windows Azure的简单教程
2015/04/16 Python
Python中的rfind()方法使用详解
2015/05/19 Python
python中实现延时回调普通函数示例代码
2017/09/08 Python
微信跳一跳python辅助软件思路及图像识别源码解析
2018/01/04 Python
Python中的默认参数实例分析
2018/01/29 Python
Python使用pyserial进行串口通信的实例
2019/07/02 Python
python flask 如何修改默认端口号的方法步骤
2019/07/12 Python
对Python函数设计规范详解
2019/07/19 Python
django数据库自动重连的方法实例
2019/07/21 Python
python循环输出三角形图案的例子
2019/11/22 Python
torch 中各种图像格式转换的实现方法
2019/12/26 Python
pandas 对group进行聚合的例子
2019/12/27 Python
Python实现对adb命令封装
2020/03/06 Python
opencv 查找连通区域 最大面积实例
2020/06/04 Python
HTML5 FormData 方法介绍以及实现文件上传示例
2017/09/12 HTML / CSS
个人投资合作协议书
2014/10/12 职场文书
植物园观后感
2015/06/11 职场文书
2016年国庆节假期旅游工作总结
2016/04/01 职场文书
JS不要再到处使用绝对等于运算符了
2021/04/30 Javascript
Vue3.0中Ref与Reactive的区别示例详析
2021/07/07 Vue.js
简单聊聊Vue中的计算属性和属性侦听
2021/10/05 Vue.js
高并发下Redis如何保持数据一致性(避免读后写)
2022/03/18 Redis
python在package下继续嵌套一个package
2022/04/14 Python