网络编程
位置:首页>> 网络编程>> Python编程>> 在python中list作函数形参,防止被实参修改的实现方法

在python中list作函数形参,防止被实参修改的实现方法

作者:shangyj17  发布时间:2022-11-15 19:27:25 

标签:python,list,形参,实参

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

来源:https://blog.csdn.net/qq_17753903/article/details/82886625

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com