在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的Twisted框架编写简单的网络客户端
Apr 16 Python
Python urllib、urllib2、httplib抓取网页代码实例
May 09 Python
shelve  用来持久化任意的Python对象实例代码
Oct 12 Python
Python利用operator模块实现对象的多级排序详解
May 09 Python
Python小游戏之300行代码实现俄罗斯方块
Jan 04 Python
Python 常用模块 re 使用方法详解
Jun 06 Python
Django使用unittest模块进行单元测试过程解析
Aug 02 Python
django之从html页面表单获取输入的数据实例
Mar 16 Python
三步解决python PermissionError: [WinError 5]拒绝访问的情况
Apr 22 Python
Python日志:自定义输出字段 json格式输出方式
Apr 27 Python
五分钟学会怎么用python做一个简单的贪吃蛇
Jan 12 Python
python抢购软件/插件/脚本附完整源码
Mar 04 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
《雄兵连》系列首部大电影《烈阳天道》:可能是因为期望值太高了
2020/08/18 国漫
解析在zend Farmework下如何创立一个FORM表单
2013/06/28 PHP
谈谈php对接芝麻信用踩的坑
2016/12/01 PHP
Jquery优化效率 提升性能解决方案
2010/09/06 Javascript
父页面显示遮罩层弹出半透明状态的dialog
2014/03/04 Javascript
常用的JS验证和函数汇总
2014/12/23 Javascript
JavaScript学习笔记之JS事件对象
2015/01/22 Javascript
JavaScript每天必学之事件
2016/09/18 Javascript
关于RequireJS的简单介绍即使用方法
2016/10/20 Javascript
bootstrap table表格插件使用详解
2017/05/08 Javascript
使用selenium抓取淘宝的商品信息实例
2018/02/06 Javascript
Bootstrap Table实现定时刷新数据的方法
2018/08/13 Javascript
vue项目开发中setTimeout等定时器的管理问题
2018/09/13 Javascript
微信小程序scroll-view点击项自动居中效果的实现
2020/03/25 Javascript
[03:17]DOTA2英雄基础教程 剧毒术士
2013/12/12 DOTA
Python中datetime常用时间处理方法
2015/06/15 Python
使用pygame模块编写贪吃蛇的实例讲解
2018/02/05 Python
python 3.6.5 安装配置方法图文教程
2018/09/18 Python
Django之无名分组和有名分组的实现
2019/04/16 Python
pycharm创建scrapy项目教程及遇到的坑解析
2019/08/15 Python
Python pip install如何修改默认下载路径
2020/04/29 Python
详解用Python爬虫获取百度企业信用中企业基本信息
2020/07/02 Python
Python中Yield的基本用法
2020/10/18 Python
俄罗斯和世界各地的酒店预订:Hotels.com俄罗斯
2016/08/19 全球购物
美国网上鞋城:Shoeline.com
2016/11/17 全球购物
MVMT手表官方网站:时尚又实惠的高品质手表
2016/12/04 全球购物
Public Desire美国/加拿大:全球性的在线鞋类品牌
2018/12/17 全球购物
Bath & Body Works阿联酋:在线购买沐浴和身体用品
2021/02/27 全球购物
.NET面试题:什么是值类型和引用类型
2016/01/12 面试题
中学生期中自我鉴定
2014/04/20 职场文书
员工三分钟演讲稿
2014/08/19 职场文书
大四优秀党员个人民主评议
2014/09/19 职场文书
学习党的群众路线教育实践活动心得体会范文
2014/11/03 职场文书
遗嘱继承权公证书
2015/01/26 职场文书
Python中threading库实现线程锁与释放锁
2021/05/17 Python
永中文档在线转换预览基于nginx配置部署方案
2022/06/10 Servers