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
以上这篇在python中list作函数形参,防止被实参修改的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]