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


相关推荐

  • Java面向对象抽象类案例分析

    Java面向对象抽象类案例分析

    2022年3月6日
    37
  • python编写时钟代码

    python编写时钟代码#!/urs/bin/python#_*_coding:utf-8#!/usr/bin/envpython#-*-coding:utf-8-*-importturtleimportdatetime#移动一段距离defskip(distance):”””移动乌龟一段距离,不留痕迹:param…

    2022年6月28日
    36
  • dump文件分析工具有哪些_如何解析xml文件

    dump文件分析工具有哪些_如何解析xml文件/前言/在讲解Mat工具之前我们先来看下几个关于Dump/文件的问题Dump文件是什么Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中我们拿到Dump文件有什么用的?假如JVM因为内存溢出的原因宕机了,而程序的日志里面并没有关于溢出所在对象的信息,此时我们就需要通过分析Dump文件来找到问题原因Dump文件怎么生成?第一种在启动JVM时指定参数 #指定生成Dump文件的异常类型 -XX:+HeapDumpOnOutOf

    2022年10月2日
    3
  • group by详解

    group by详解一. 概述group_by的意思是根据by对数据按照哪个字段进行分组,或者是哪几个字段进行分组。二. 语法select 字段  from 表名 where  条件  group by    字段或者select 字段  from 表名 group by  字段  having  过滤条件注意:对于过滤条…

    2022年5月26日
    52
  • bat启动命令行_cmd打开bat文件

    bat启动命令行_cmd打开bat文件写了个win环境本地启动的java项目,又不想每次去win+R再开启powershell(win10环境)所以百度了一下bat脚本参考了大佬的文章:https://www.cnblogs.com/LiuYanYGZ/p/12078984.html只需要简单的命令就可以了:startcmd/kechoHello,World!##执行完毕以后,新开的窗…

    2022年9月23日
    4
  • C#第七回:DialogResult

    C#第七回:DialogResult一直没太搞明白这个逻辑是什么意思,今天无意中看到个例子,终于小小的理解了一下。下面这段代码很好理解,//createanewdialog,andgetthevaluebyusingdialogResultDialogResultdialogResult=MessageBox.Show("是否要创建目录"+textBox1…

    2022年6月22日
    28

发表回复

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

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