Python变量赋值与引用之对象是否可变详解

 更新时间:2025年05月21日 10:47:57   作者:牛顿编程  
Python的变量赋值是一个复杂的过程,涉及到内存分配、引用计数、数据类型和深浅拷贝等多个方面,这篇文章主要介绍了Python变量赋值与引用之对象是否可变的相关资料,需要的朋友可以参考下

概述

在Python中,变量赋值的机制涉及到对象的引用和对象的可变性。变量名只是对象的引用,而不是直接存储数据。因此,变量ab赋值后的行为差异,取决于两个因素:

  • 对象是否可变(Mutable/Immutable)。
  • 修改操作的类型(直接修改对象内容,还是重新赋值变量)。

1. 不可变对象(Immutable Objects)

不可变对象的值一旦创建,就不能修改其内容,例如:

  • 整数(int
  • 字符串(str
  • 元组(tuple
  • 布尔值(bool)等。

场景:修改变量的新赋值

a = 5         # a指向整数对象5
b = a         # b也指向同一个整数对象5

a = 6         # 此时a指向新的整数对象6,但b仍指向5

print(b)      # 输出5

原因

  • 赋值操作 b = a 时,仅复制引用,使得 a 和 b 都指向同一个对象(初始是5)。
  • 当 a = 6 时,a 的引用被更新为指向新对象6,而 b 仍然指向原对象5。
  • 不可变对象无法被修改内容,只能重新创建新对象,因此 b 不会变化。

场景:尝试直接修改对象内容(无效)

a = "hello"   # a指向字符串"hello"
b = a         # b也指向相同的字符串对象

# 尝试修改字符串内容(但不可变对象不允许此操作)
a[0] = "H"    # 报错:'str' object does not support item assignment

结果:此操作根本无法执行,因为字符串是不可变的。

2. 可变对象(Mutable Objects)

可变对象的值可以在创建后被修改,例如:

  • 列表(list
  • 字典(dict
  • 集合(set
  • 自定义类实例等。

场景:直接修改对象内容

a = [1, 2]    # a指向列表[1, 2]
b = a         # b指向同一个列表对象

a.append(3)   # 修改列表内容,原列表变为[1, 2, 3]

print(b)      # 输出[1, 2, 3]

原因

  • a 和 b 指向同一个列表对象。
  • append() 方法直接修改了该对象的内部内容,因此两个变量看到的都是同一个被修改后的对象。

场景:修改变量的引用(不影响对方)

a = [1, 2]
b = a

a = [3, 4]    # a的引用被更新为新列表[3,4],但b仍指向原列表[1,2]

print(b)      # 输出[1, 2]

原因

  • a = [3,4] 是一个新的赋值操作,直接改变了a的引用,使其指向新对象,而b未被修改,依然指向原列表。

3. 核心总结

情况行为差异原因
修改对象内容(可变对象)a 和 b 指向同一个对象,修改内容会影响双方。
直接重新赋值变量(任何对象)a 的引用指向新对象,而 b 的引用未变,因此 b 的值不受影响。
尝试修改不可变对象的内容不可变对象无法被修改,只能生成新对象,原对象的引用不会改变。因此 b 不变。

4. 如何避免混淆

  • 不可变对象:赋值后的变量如果像“修改了 ab 不变”,这是因为实际是生成了新对象。
  • 可变对象:赋值后的变量如果像“修改了 ab 也变”,是因为两变量指向同一个对象,修改内容会影响双方。

若希望二者独立

  • 对可变对象使用深拷贝或浅拷贝
    import copy
    b = copy.deepcopy(a)  # 完全独立的副本
    

示例表格

示例代码是否修改对象内容a 的值b 的值
a = 5; b = a; a = 665
a = [1]; b = a; a[0] = 2是(修改可变对象)[2][2]
a = [1]; b = a; a = [2][2][1]
`a = “str”; b = a; a += “1”否(生成新对象)"str1""str"

关键点:

  • 赋值是引用的复制b = a 仅让两个变量指向同一个对象。
  • 修改内容 vs 重新赋值
    • 修改内容:影响所有指向该对象的变量。
    • 重新赋值:仅修改当前变量的引用,不影响其他变量。

总结 

到此这篇关于Python变量赋值与引用之对象是否可变的文章就介绍到这了,更多相关Python对象是否可变内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Python的OpenCV模块识别滑动验证码的缺口(推荐)

    使用Python的OpenCV模块识别滑动验证码的缺口(推荐)

    这篇文章主要介绍了使用Python的OpenCV模块识别滑动验证码的缺口,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • Python实现批量下载文件的代码详解

    Python实现批量下载文件的代码详解

    下载文件是我们在日常工作中常常要做的一件事情,当我们需要从互联网上批量下载大量文件时,手动一个一个去下载显然不够高效,为了解决这个问题,我们可以使用Python编写一个批量下载文件的脚本,让它自动帮我们下载文件,下面小编给大家详细介绍一下
    2025-05-05
  • Python实现ping指定IP的示例

    Python实现ping指定IP的示例

    今天小编就为大家分享一篇Python实现ping指定IP的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • python列表的构造方法list()

    python列表的构造方法list()

    这篇文章主要介绍了python列表的构造方法list(),python中没有数组这个概念,与之相应的是列表,本篇文章就来说说列表这个语法,下面文章详细内容,需要的小伙伴可以参考一下
    2022-03-03
  • 使用Python实现图像有效压缩的方法

    使用Python实现图像有效压缩的方法

    在数字时代,图像作为信息传递的重要媒介,在网页设计、移动应用和多媒体制作中扮演着不可或缺的角色,本文将详细介绍如何使用Python,一个功能强大且易于学习的编程语言,来实现图像的有效压缩,感兴趣的朋友可以参考下
    2024-03-03
  • python regex库实例用法总结

    python regex库实例用法总结

    在本篇内容里小编给大家整理了关于python regex库实例用法总结内容,有需要的朋友们参考学习下。
    2021-01-01
  • python实现windows壁纸定期更换功能

    python实现windows壁纸定期更换功能

    这篇文章主要为大家详细介绍了python实现windows壁纸定期更换功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 教你在pycharm中使用tensorflow的方法

    教你在pycharm中使用tensorflow的方法

    当前使用的是anaconda的3.8版本,无法正常下载tensorflow包,需要构建虚拟环境使用3.7及以下的解释器才可以,如何解决这个问题呢,下面小编给大家带来了如何在pycharm中使用tensorflow,感兴趣的朋友参考下吧
    2021-11-11
  • Python常用知识点汇总

    Python常用知识点汇总

    这篇文章主要介绍了Python常用知识点汇总,包括Set集合,函数,深入拷贝,浅入拷贝,需要的朋友可以参考下
    2016-05-05
  • Python操作MongoDB的教程详解(插,查,改,排,删)

    Python操作MongoDB的教程详解(插,查,改,排,删)

    MongoDB是一个基于分布式文件存储的数据库。是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。本文将详细和大家聊聊Python操作MongoDB的方法,需要的可以参考一下
    2022-09-09

最新评论