在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 相关文章推荐
如何搜索查找并解决Django相关的问题
Jun 30 Python
Python脚本实现集群检测和管理功能
Mar 06 Python
python实现简单聊天应用 python群聊和点对点均实现
Sep 14 Python
用Python逐行分析文件方法
Jan 28 Python
Python enumerate函数功能与用法示例
Mar 01 Python
python3实现表白神器
Apr 09 Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
Apr 12 Python
Python通用函数实现数组计算的方法
Jun 13 Python
python os.fork() 循环输出方法
Aug 08 Python
python 画3维轨迹图并进行比较的实例
Dec 06 Python
Python selenium爬取微信公众号文章代码详解
Aug 12 Python
Django利用AJAX技术实现博文实时搜索
May 06 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
FleaPHP的安全设置方法
2008/09/15 PHP
浅谈php中的循环while、do...while、for、foreach四种循环
2016/11/05 PHP
JScript中的&quot;this&quot;关键字使用方式补充材料
2007/03/08 Javascript
jsTree树控件(基于jQuery, 超强悍)[推荐]
2009/09/01 Javascript
浅析javascript中function 的 length 属性
2014/05/27 Javascript
javascript实现可拖动变色并关闭层窗口实例
2015/05/15 Javascript
JavaScript截取指定长度字符串点击可以展开全部代码
2015/12/04 Javascript
理解JavaScript原型链
2016/10/25 Javascript
jQuery 如何实现一个滑动按钮开关
2016/12/01 Javascript
jQuery向webApi提交post json数据
2017/01/16 Javascript
AngularJS2中一种button切换效果的实现方法(二)
2017/03/27 Javascript
Node.js EventEmmitter事件监听器用法实例分析
2019/01/07 Javascript
layui form表单提交之后重新加载数据表格的方法
2019/09/11 Javascript
js实现贪吃蛇小游戏
2019/10/29 Javascript
JavaScript创建表格的方法
2020/04/13 Javascript
[15:09]DOTA2国际邀请赛采访专栏:Loda
2013/08/06 DOTA
python使用smtplib模块通过gmail实现邮件发送的方法
2015/05/08 Python
Python中DJANGO简单测试实例
2015/05/11 Python
Python实现按当前日期(年、月、日)创建多级目录的方法
2018/04/26 Python
Pycharm 设置自定义背景颜色的图文教程
2018/05/23 Python
解决python报错MemoryError的问题
2018/06/26 Python
Sanic框架异常处理与中间件操作实例分析
2018/07/16 Python
python 读写excel文件操作示例【附源码下载】
2019/06/19 Python
Python生成pdf目录书签的实例方法
2020/10/29 Python
一个非常简单好用的Python图形界面库(PysimpleGUI)
2020/12/28 Python
css3实现背景动态渐变效果
2019/12/10 HTML / CSS
天猫精选:上天猫,就够了
2016/09/21 全球购物
芬兰汽车配件商店:Autonvaraosat24
2017/01/30 全球购物
GAZMAN官网:澳大利亚领先的男装品牌
2019/12/19 全球购物
大学自主招生推荐信
2014/05/10 职场文书
中学生运动会新闻稿
2014/09/24 职场文书
政协会议宣传标语
2014/10/09 职场文书
2015大学生求职信范文
2015/03/20 职场文书
CocosCreator入门教程之网络通信
2021/04/16 Javascript
Python中使用subprocess库创建附加进程
2021/05/11 Python
Java服务调用RestTemplate与HttpClient的使用详解
2022/06/21 Java/Android