在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 制作图片转pdf工具
Jan 30 Python
介绍Python的Django框架中的QuerySets
Apr 20 Python
python在线编译器的简单原理及简单实现代码
Feb 02 Python
pandas 取出表中一列数据所有的值并转换为array类型的方法
Apr 11 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
Nov 18 Python
python多任务及返回值的处理方法
Jan 22 Python
Python 过滤错误log并导出的实例
Dec 26 Python
Python flask框架端口失效解决方案
Jun 04 Python
python连接mysql数据库并读取数据的实现
Sep 25 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
Nov 18 Python
基于python实现监听Rabbitmq系统日志代码示例
Nov 28 Python
pycharm最新激活码有效期至2100年(亲测可用)
Feb 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
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
Laravel解决nesting level错误和隐藏index.php的问题
2019/10/12 PHP
javascript new fun的执行过程
2010/08/05 Javascript
firefox下frameset取不到值的解决方法
2010/09/06 Javascript
js中判断Object、Array、Function等引用类型对象是否相等
2012/08/29 Javascript
json对象转字符串如何实现
2012/12/02 Javascript
JQuery实现的按钮倒计时效果
2015/12/23 Javascript
JavaScript代码实现图片循环滚动效果
2020/03/19 Javascript
微信小程序中的swiper组件详解
2017/04/14 Javascript
二维码图片生成器QRCode.js简单介绍
2017/08/18 Javascript
JavaScript中运算符规则和隐式类型转换示例详解
2017/09/06 Javascript
IntelliJ IDEA 安装vue开发插件的方法
2017/11/21 Javascript
浅谈webpack组织模块的原理
2018/03/10 Javascript
微信小程序wx.uploadfile 本地文件转base64的实现代码
2018/06/28 Javascript
JavaScript的Object.defineProperty详解
2018/07/09 Javascript
20个必会的JavaScript面试题(小结)
2019/07/02 Javascript
浅谈vue3中effect与computed的亲密关系
2019/10/10 Javascript
原理深度解析Vue的响应式更新比React快
2020/04/04 Javascript
[01:07:19]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第一场
2018/04/06 DOTA
讲解Python中if语句的嵌套用法
2015/05/14 Python
Python下的Softmax回归函数的实现方法(推荐)
2017/01/26 Python
python3.5绘制随机漫步图
2018/08/27 Python
numpy.random模块用法总结
2019/05/27 Python
django-crontab实现服务端的定时任务的示例代码
2020/02/17 Python
Gweniss格温妮丝女包官网:英国纯手工制造潮流包包品牌
2018/02/07 全球购物
Hunkemöller瑞士网上商店:欧洲最大的内衣品牌之一
2018/12/03 全球购物
英国在线照明超市:Castlegate Lights
2019/10/30 全球购物
小学生优秀评语大全
2014/04/22 职场文书
奥巴马英文演讲稿
2014/05/15 职场文书
校庆口号
2014/06/20 职场文书
2014年路政工作总结
2014/12/10 职场文书
科级干部培训心得体会
2016/01/06 职场文书
利用Python多线程实现图片下载器
2022/03/25 Python
Mybatis-plus配置分页插件返回统一结果集
2022/06/21 Java/Android
React自定义hook的方法
2022/06/25 Javascript
windows server2012 R2下安装PaddleOCR服务的的详细步骤
2022/09/23 Servers