在python中list作函数形参,防止被实参修改的实现方法
作者:shangyj17 发布时间:2022-11-15 19:27:25
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)
从运行结果上,可以看出,
虽然我们改变的是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,不方便,我做对比,经过查询和学习,总结如下:
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
来源:https://blog.csdn.net/qq_17753903/article/details/82886625
猜你喜欢
- 第二次遇到FF下正则兼容性问题( 第一次是关于"g"全局标志的,现在网上已有很多相关文章介绍)。以下正则在FF和IE下的
- 本文实例讲述了Python Django模板之模板过滤器与自定义模板过滤器。分享给大家供大家参考,具体如下:模板过滤器过滤器用于对模板变量进
- 《用户研究角度看设计》系列是淘宝的用户研究团队在可用性测试之后的点滴思考。在每次与淘宝用户的直接接触、观察用户的操作之后,作为体验分析师的我
- 在日常开发中,我们进行用户登录的时候,大部分情况下都会使用 session 来保存用户登录信息,并以此为依据判断用户是否已登录。但其实 HT
- 遇到复杂计算找python绝对不让你失望,sympy是一个Python的科学计算库,用一套强大的符号计算体系完成诸如多项式求值、求极限、解方
- 前言将字符串动态转换为DOM节点,在开发中经常遇到,尤其在模板引擎中更是不可或缺的技术。字符串转换为DOM节点本身并不难,本篇文章主要涉
- <% On Error Resume Next Const uploadPath = "/uploads/"
- Python# coding=utf-8import timeimport sysdef func(): # 格式化输出时间 &
- 本文实例讲述了python实现linux下使用xcopy的方法。分享给大家供大家参考。具体如下:这个python函数模仿windows下的x
- 1. 将Oracle 10g client安装包copy到本地才能安装:2. 双击setup 的到:3. 稍后进入安装界面:4. 选择下一步
- 一、pandas的统计分析1、关于pandas 的数值统计(统计detail 中的 单价的相关指标)import pandas as pd#
- 分享一下 IntelliJ IDEA 2021.1 的激活破解教程,相当于永久激活了,亲测有效,下面是详细文档哦~申明:本教程 Intell
- 前段时间做一个小项目碰到了一个导航制作的方式然后突然想到曾经很久以前看到的梯形状的不规则导航,就尝试做了一下。结果碰到了几个问题,后来在同事
- 本文实例讲述了Python实现测试磁盘性能的方法。分享给大家供大家参考。具体如下:该代码做了如下工作:create 300000 files
- 问题最近在工作中遇到一个问题,在安装python软件包的时候,经常会遇类似这样一个问题。比如对于ipython,机子本身安装的版本是1.2.
- 有一个古老的争论,是关于在哪里存储应用程序业务逻辑的:是在应用程序本身的业务逻辑层中还是在数据库层中。应用程序逻辑层的绝对支持者提出,数据库
- 在前一文中记述了Access启动不了,或者出现“正在准备安装……”的问题,今天则找到了Access对控件支持的问题。本来Access、Exc
- 本文实例讲述了PHP简单检测网址是否能够正常打开的方法。分享给大家供大家参考,具体如下:这是一个检测网址是否能正常打开的PHP代码,通过下面
- 如下所示:(x,y)为要转的点,(pointx,pointy)为中心点,如果顺时针角度为anglesrx = (x-pointx)*cos(
- 如何使用表单发送电子邮件?邮件也可以用表单格式发送吗?我见一个朋友这样做的。当然可以,用OCXMail就行:formToEmail.htm&