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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • WinForm设置右键菜单

    上一篇:设置窗体透明C#代码如果要实现MDI窗体的右键菜单,可以添加一个contextMenuStrip(ID设置为:contextMenuStrip_hewenqi),然后设置窗体的Context

    2021年12月21日
    44
  • stm32 独立看门狗时钟配置[通俗易懂]

    stm32 独立看门狗时钟配置[通俗易懂]独立看门狗的时钟源为40k,分频因子最大为256//初始化独立看门狗 5秒钟//prer:分频数:0~7(只有低3位有效!)//分频因子=4*2^prer.但最大值只能是256!//rlr:重装载寄存器值:低12位有效,最大只能是4096//时间计算(大概):Tout=40K/((4*2^prer)*rlr)值.voidIWDG_Init(u8prer,u16rlr){ IWDG_Writ…

    2022年5月10日
    60
  • pandas中使用fillna函数填充NaN值「建议收藏」

    pandas中使用fillna函数填充NaN值「建议收藏」1.参数解析1.1inplace参数取值:True、FalseTrue:直接修改原对象False:创建一个副本,修改副本,原对象不变(缺省默认)1.2method参数取值:{‘pad’,‘ffill’,‘backfill’,‘bfill’,None},defaultNonepad/ffill:用前一个非缺失值去填充该缺失值backfill/bfill:用下一个非缺失值填充该缺失值None:指定一个值去替换缺失值(缺省默认这种方式)1.3limit参数:限制

    2022年8月12日
    8
  • snmp协议的trap操作采用基于_maven批量导入jar包

    snmp协议的trap操作采用基于_maven批量导入jar包snmptrap与snmpSNMP简单概述1.1、什么是SnmpSNMP是英文”SimpleNetworkManagementProtocol”的缩写,中文意思是”简单网络管理协议”。SNMP是一种简单网络管理协议,它属于TCP/IP五层协议中的应用层协议,用于网络管理的协议。SNMP主要用于网络设备的管理。由于SNMP协议简单可靠,受到了众多厂商的欢迎,成为了目前最为广泛的网管协议。SNMP协议主要由两大部分构成:SNMP管理站和SNMP代理。SNMP管理站是一个中心节点,负责收集维护

    2022年8月20日
    12
  • 智慧小区门禁好处多,你都get到了吗?「建议收藏」

    智慧小区门禁好处多,你都get到了吗?「建议收藏」现在,人们越来越注重信息安全、财产安全、人身安全。随着科技与人工智能的发展,门禁系统也进行升级,智慧门禁系统逐渐进入人们视野,智慧社区服务正在进行。智慧小区门禁识别技术设计原则人性化“人”是主体,系统设计应紧紧围绕着人们的实际需求,以实用、简便、经济、安全的原则,同时照顾到不同人群的需要,满足用户使用门禁功能。智慧小区门禁由于没有分机,没有大量布线,维护成本不到传统门禁的20%。智能门禁厂家可以…

    2022年10月17日
    2
  • (转)[IDEA]如何安装codelf[通俗易懂]

    (转)[IDEA]如何安装codelf[通俗易懂]stormgolandpycharmwebstormIntelliJidea等)安装步骤直接浏览器访问http://unbug.github.io/codelf/JetBrainsIDE插件安装插件安装onlinesearch配置onlinesearch添加codelf搜索onlinesearch设置快捷键

    2022年5月4日
    136

发表回复

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

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