在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 11 Python
使用python编写android截屏脚本双击运行即可
Jul 21 Python
python分析网页上所有超链接的方法
May 08 Python
Python判断Abundant Number的方法
Jun 15 Python
python插入排序算法实例分析
Jul 03 Python
对Python之gzip文件读写的方法详解
Feb 08 Python
django框架自定义模板标签(template tag)操作示例
Jun 24 Python
Python实现一个带权无回置随机抽选函数的方法
Jul 24 Python
Python3使用PySynth制作音乐的方法
Sep 09 Python
python通过文本在一个图中画多条线的实例
Feb 21 Python
Django中文件上传和文件访问微项目的方法
Apr 27 Python
python实现定时发送邮件到指定邮箱
Dec 23 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学习之PHP表达式
2006/10/09 PHP
同时提取多条新闻中的文本一例
2006/10/09 PHP
php模板原理讲解
2013/11/13 PHP
php中rename函数用法分析
2014/11/15 PHP
PHP简单实现生成txt文件到指定目录的方法
2016/04/25 PHP
指定js可访问其它域名的cookie的方法
2007/09/18 Javascript
js indexOf()定义和用法
2012/10/21 Javascript
javascript自定义右键弹出菜单实现方法
2015/05/25 Javascript
javascript弹性运动效果简单实现方法
2016/01/08 Javascript
js基于myFocus实现轮播图效果
2017/02/14 Javascript
如何编写一个完整的Angular4 FormText 组件
2017/11/18 Javascript
分享5个好用的javascript文件上传插件
2018/09/16 Javascript
JS中数据结构之栈
2019/01/01 Javascript
JS实现的获取银行卡号归属地及银行卡类型操作示例
2019/01/08 Javascript
详解JavaScript中关于this指向的4种情况
2019/04/18 Javascript
如何使用CSS3和JQuery easing 插件制作绚丽菜单
2019/06/18 jQuery
vue 源码解析之虚拟Dom-render
2019/08/26 Javascript
DJANGO-ALLAUTH社交用户系统的安装配置
2014/11/18 Python
python切片(获取一个子列表(数组))详解
2019/08/09 Python
Python 中 sorted 如何自定义比较逻辑
2021/02/02 Python
CSS3+HTML5+JS 实现一个块的收缩与展开动画效果
2020/11/17 HTML / CSS
用HTML5实现鼠标滚轮事件放大缩小图片的功能
2015/06/25 HTML / CSS
美国最古老的精致书写工具制造商:A.T. Cross(高仕)
2018/01/30 全球购物
马歇尔耳机官网:Marshall Headphones
2020/02/04 全球购物
总监职责范文
2013/11/09 职场文书
母亲80寿诞答谢词
2014/01/16 职场文书
运动会解说词50字
2014/01/18 职场文书
学校门卫管理制度
2014/01/30 职场文书
年终晚会主持词
2014/03/25 职场文书
企业总经理任命书
2014/06/05 职场文书
应用外语系自荐信
2014/06/26 职场文书
小学教师岗位职责
2015/04/02 职场文书
班主任远程培训研修日志
2015/11/13 职场文书
趣味运动会口号
2015/12/24 职场文书
导游词之日本富士山
2020/01/06 职场文书
5个pandas调用函数的方法让数据处理更加灵活自如
2022/04/24 Python