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


相关推荐

  • 阿里云服务器开放端口如何设置_阿里云服务器8888端口

    阿里云服务器开放端口如何设置_阿里云服务器8888端口阿里云服务器开放端口阿里云服务器默认是只开放了部分端口,我们部署自己的服务需要监听一下80,8080等端口时,就需要自己设置安全策略,本文介绍如何设置阿里云的安全组,开放需要的端口步骤点击阿里云的的控制台点击进入云服务器点击进入安全组菜单,点击创建安全组按钮,添加一个新的安全组2.进入创建新安全组页面填写一下必要的信息,然后配置访问规则,包括入站和出站,点击手动添加一条,设置开放所有的端口,包括端口和授权对象,点击创建安全组按钮,将创建一条新的安全组出站我们也可以配置,默

    2022年10月3日
    2
  • 微信网页分享(配合微信公众平台)[通俗易懂]

    微信网页分享(配合微信公众平台)[通俗易懂]JAVA前后端调用微信接口,实现页面分享功能(分享到朋友圈,分享给朋友)

    2022年8月20日
    5
  • SMTP服务器地址_imap服务器怎么设置

    SMTP服务器地址_imap服务器怎么设置认识SMTP服务器首先要知道SMTP,SMTP是“SimpleMailTransferProtocol”的缩写,即简单电子邮件传输协议,而SMTP服务器就是遵循SMTP协议发送电子邮件的服务器,用来发送或中转用户发出的电子邮件。SMTP协议是一个相对简单、高效的文本协议,使用25端口,属于TCP/IP协议族,可以帮助每台SMTP服务器在发送或中转电子邮件时找到下一个目的地,要为一个给定的域名决定…

    2022年10月3日
    6
  • Deepin安装MariaDB数据库

    Deepin安装MariaDB数据库在deeping上安装mariadb 1,安装的官网参考:有安装的命令和指导https://downloads.mariadb.org/mariadb/repositories/#distro=Debian&distro_release=jessie–jessie&mirror=tuna&version=10.4其主官网地址:https://downloads.mariadb.org/  2,安装mari…

    2022年5月11日
    44
  • 配置是如何进行的 configure

    配置是如何进行的 configure

    2021年7月30日
    61
  • ip2long与long2IP 分析

    ip2long与long2IP 分析

    2021年10月18日
    45

发表回复

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

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