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)
上一篇 2025年6月11日 下午2:01
下一篇 2025年6月11日 下午2:22


相关推荐

  • “电梯汇报”方法

    “电梯汇报”方法将问题通过:时间维度、空间维度、立体维度三个方面立体的表达。      时间维度:比如“昨天、今天、明天”“过去、现在、将来”等      空间维度:比如“国内、国外”“北京、上海、深圳”等      立体维度:比如“XXX方面”“XXX进展””“XXX风险”

    2022年5月5日
    42
  • docker认证_spring 全局异常处理

    docker认证_spring 全局异常处理项目背景:采用SpringCloud+IDEA+Maven搭建了由多个微服务组成的项目,部署上线是在多个阿里服务器里的。问题描述:部署上线过程中,各个微服务都正常启动,而且都注册到了eureka注册中心,但是相互调用时报java.net.UnknownHostException:主机名的错误。问题原因思考:各个微服务是以“主机名:服务名:端口”的形式注册到注册中心。当发布测试时,服务器…

    2022年8月21日
    10
  • openclaw 配置本地安装的大模型qwen2.5:7b,0成本竟是如此简单

    openclaw 配置本地安装的大模型qwen2.5:7b,0成本竟是如此简单

    2026年3月12日
    3
  • 最艰难的采访IT公司ThoughtWorks代码挑战——FizzBuzzWhizz游戏

    最艰难的采访IT公司ThoughtWorks代码挑战——FizzBuzzWhizz游戏

    2022年1月5日
    48
  • 将文件导入到数据库中_将csv文件导入mysql数据库

    将文件导入到数据库中_将csv文件导入mysql数据库如何将 .sql数据文件导入到SQLsever中?我一开始是准备还原数据库的,结果出现了如下问题。因为它并不是备份文件,所以我们无法进行还原。正确方式:先打开SQLsever2008然后登录,假如出现如下问题则是“对象资源管理器”未开启解决办法,我们打开SQL配置管理器 然后这里是暂停或者是已停止,我们将其打开就行。

    2026年4月15日
    9
  • freopen无法读取问题

    freopen无法读取问题练习 PAT 时采用 freopen 编程输出文件内容不正确 nbsp nbsp freopen E Dev Cpp PAT basic 1032 1032in txt r stdin nbsp nbsp nbsp freopen E Dev Cpp PAT basic 1032 1032out txt w stdout 刚开始以为是代码问题 nbsp 手动终端输入输出无问题修了半天 bug 竟是文件

    2026年3月18日
    2

发表回复

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

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