Python值传递还是引用传递

Python值传递还是引用传递Python 值传递还是引用传递 Python 作为一门动态语言 变量本身的类型是不固定的 因此更加灵活 那 Python 到底是值传递还是引用传递呢 问题引出本人在本周写代码时 遇到这么一个让我吃惊的问题 问题可以抽象如下 deffunc val1 val2 val1val2 append 1 a 一系列对 a 的操作 b afunc a

Python值传递还是引用传递

Python作为一门动态语言,变量本身的类型是不固定的,因此更加灵活。那Python到底是值传递还是引用传递呢?

问题引出

本人在本周写代码时,遇到这么一个让我注意的问题,问题可以抽象如下:

def func(val1): val2 = val1 val2.append(1) ... a = [] ...(一系列对a的操作) b = a func(a) print(b)

当我执行上述后,发现“b”的值也发生了改变。由此引发了我对Python传值方式的注意。

赋值


这里写图片描述


“=”(赋值号)是将右侧对象的内存地址赋值给左侧的变量。
当我们写下面语句时:

a = "abc"
a = "123" b = a a = "xyz"


这里写图片描述

执行第二句,因为“a”已经存在,并不会创建新的对象,但会创建变量“b”,并把“b”指向“a”指向的字符串“123“。


这里写图片描述

执行第三句,首先会创建字符串“xyz”,然后把“xyz”的地址赋予“a“(“a”指向字符串“xyz”)。


这里写图片描述

我们可以通过调用id()方法查看变量所指向对象在内存中的地址。

a = "123" id(a) # 48,这个数字就代表了a所指向的对象在内存中地址

值传递还是引用传递

浅拷贝(copy)和深拷贝(deepcopy)


这里写图片描述
可以发现变量“a”,“b”指向同一块内存区域,所以对其中一个的操作将会影响到另一个。
2、使用copy模块


这里写图片描述
变量“e”和“f”是通过copy方式创建的,可以看见他们的idhubu相同,并且与“c”不同,说明采用copy方式会将对象拷贝一份到新的内存地址中。但copy和deepcopy有什么区别呢?接着往下实验


这里写图片描述
从红色框出来处可以看见,虽然使用copy()方法,变量“i”指向的内存和“g”不再相同,但是“i”和“g”第二层列表还是同一个地址。但是deepcopy()方法第二层列表的地址也和“g”不同了。
所以我们说,copy()是浅拷贝,不管对象多么复杂,都只拷贝第一层。


这里写图片描述
deepcopy()是深拷贝,完全复制原变量的所有层的所有数据,在内存中生成一套完全相同的内容。


这里写图片描述














版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233917.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • kali最新版安装教程_kali linux安卓版安装

    kali最新版安装教程_kali linux安卓版安装百度搜索kali,就是它了顺着箭头安装,建议使用网盘或者IDM下载,浏览器等待时间太长。下载后解压文件夹,然后打开VMware输入默认的虚拟机账号密码,均为kali选择第一个,然后我们的kali就安装好了。之后就是获取root最高权限方便我们使用kaili所有的工具点击openterminalhere输入sudopasswdroot回车,输入原来密码:kali设置新密码.之前的用户会被注销,登录新的账号回到桌面再次点击openterminalhere,可以看到我们的权限已

    2025年6月7日
    4
  • [转载]织梦CMS首页调用分类信息栏目及列表方法

    [转载]织梦CMS首页调用分类信息栏目及列表方法

    2021年9月20日
    55
  • nginx源代码分析–event事件驱动初始化

    nginx源代码分析–event事件驱动初始化

    2021年12月13日
    34
  • HTML登录界面的实现详解

    HTML登录界面的实现详解前言序锦前阵子参加学校的暑期实习,我作为项目负责人,除了进行统筹规划,整体运营以及进度安排等工作外呢,我还负责了前端模块,参与并编写了前端页面,在之前学过前端的基础上,本次参与前端的编写就比较容易了,我和另外一个伙伴我们选择了套用模板,在模板的基础上修改成我们想要的样子,这一点很重要,在这样一个很短的时间内,进行前端的编写,我们最好的选择就是进行模板的修改,但对于初学者来说,就算是…

    2022年5月11日
    75
  • 加密芯片介绍 加密芯片选择(加密IC) 加密芯片原理

    加密芯片介绍 加密芯片选择(加密IC) 加密芯片原理原文链接:https://blog.csdn.net/chengjian815/article/details/107516575前端时间有研究多款加密芯片,加密算法实现,以及激活成功教程可能,也有一些个人的观点,仅供参考;一,加密芯片的来源及工作流程:市面上的加密芯片,基本都是基于某款单片机,使用I2C或SPI等通讯,使用复杂加密算法加密来实现的,流程大致如下:主控芯片生成随机码–>主控芯片给加密芯片发送明文–>加密芯片通过加密算法对明文进行加密生成密文–>

    2022年6月25日
    58
  • 如何查看linux系统的内核版本信息_内核版本

    如何查看linux系统的内核版本信息_内核版本查看Linux内核版本和系统版本信息**一、查看Linux内核版本命令(两种方法):1、cat/proc/version2、uname-a二、查看Linux系统版本的命令(3种方法):1、lsb_release-a,即可列出所有版本信息这个命令适用于所有的Linux发行版,包括RedHat、SUSE、Debian…等发行版。2、cat/etc/redhat-release,这…

    2022年10月13日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号