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

 更新时间:2020年06月05日 09:40:17   作者:shangyj17  
这篇文章主要介绍了在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)

从运行结果上,可以看出,

虽然我们改变的是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作函数形参,防止被实参修改的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • python如何安装下载后的模块

    python如何安装下载后的模块

    在本篇文章里小编给大家整理了关于python安装下载后的模块的方法,需要的朋友们可以学习下。
    2020-07-07
  • Python+Pygame实现趣味足球游戏

    Python+Pygame实现趣味足球游戏

    这篇文章主要为大家分享了一个基于Python和Pygame实现的一个趣味足球游戏,文中的示例代码讲解详细,对我们学习Python有一定帮助,需要的可以参考一下
    2022-05-05
  • python 3.6.2 安装配置方法图文教程

    python 3.6.2 安装配置方法图文教程

    这篇文章主要为大家详细介绍了python 3.6.2 安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • python目标检测yolo2详解及预测代码复现

    python目标检测yolo2详解及预测代码复现

    这篇文章主要为大家介绍了python目标检测yolo2详解及其预测代码复现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • django-crontab 定时执行任务方法的实现

    django-crontab 定时执行任务方法的实现

    这篇文章主要介绍了django-crontab 定时执行任务方法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Python中使用haystack实现django全文检索搜索引擎功能

    Python中使用haystack实现django全文检索搜索引擎功能

    django是python语言的一个web框架,功能强大。配合一些插件可为web网站很方便地添加搜索功能。下面通过本文给大家分享Python中使用haystack实现django全文检索搜索引擎功能,感兴趣的朋友一起看看吧
    2017-08-08
  • Django中Cookie设置及跨域问题处理详解

    Django中Cookie设置及跨域问题处理详解

    本文主要介绍了Django中Cookie设置及跨域问题处理,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Python中tkinter库的简单使用

    Python中tkinter库的简单使用

    这篇文章主要介绍了Python中tkinter库的简单使用,Tkinter是Python中常用的GUI库,它使用Tk GUI工具包,并提供了创建各种GUI应用程序的功能,需要的朋友可以参考下
    2023-10-10
  • Python中ConfigParser模块示例详解

    Python中ConfigParser模块示例详解

    有些时候在项目中,使用配置文件来配置一些灵活的参数是比较常见的事,因为这会使得代码的维护变得更方便,而ini配置文件是比较常用的一种,今天介绍用ConfigParser模块来解析ini配置文件,感兴趣的朋友一起看看吧
    2023-01-01
  • pygame开发:马赛逻辑小游戏的代码实现

    pygame开发:马赛逻辑小游戏的代码实现

    这篇文章主要介绍了pygame开发,通过本文,您可以使用pygame开发一个马赛逻辑小游戏~有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-09-09

最新评论