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爬虫学习笔记--BeautifulSoup4库的使用详解

    python爬虫学习笔记--BeautifulSoup4库的使用详解

    这篇文章主要介绍了Python中使用Beautiful Soup库的超详细教程,示例代码基于Python2.x版本,极力推荐!需要的朋友可以参考下
    2021-08-08
  • 用OpenCV进行年龄和性别检测的实现示例

    用OpenCV进行年龄和性别检测的实现示例

    这篇文章主要介绍了用 OpenCV 进行年龄和性别检测的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 用Python selenium实现淘宝抢单机器人

    用Python selenium实现淘宝抢单机器人

    今天给大家带来的是关于Python实战的相关知识,文章围绕着用Python selenium实现淘宝抢单机器人展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • python实现统计代码行数的小工具

    python实现统计代码行数的小工具

    这篇文章主要为大家详细介绍了python实现统计代码行数的小工具,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • 在win64上使用bypy进行百度网盘文件上传功能

    在win64上使用bypy进行百度网盘文件上传功能

    这篇文章主要介绍了在win64上使用bypy进行百度网盘文件上传功能,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • Python字符串对齐和判断方法汇总

    Python字符串对齐和判断方法汇总

    本教程将详细介绍Python中的字符串对齐方法以及字符串判断方法,这些方法在文本处理、格式化输出和字符串匹配中非常实用,无论你是Python初学者还是想要巩固基础知识的程序员,这篇教程都能帮助你全面理解这些操作,需要的朋友可以参考下
    2025-04-04
  • python批量修改xml属性的实现方式

    python批量修改xml属性的实现方式

    这篇文章主要介绍了python批量修改xml属性的实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • 利用Python实现自动工作汇报的脚本分享

    利用Python实现自动工作汇报的脚本分享

    这篇文章主要为大家详细介绍了如何利用Python实现一个自动工作汇报的脚本,文中的示例代码讲解详细,对我们学习Python有一定帮助,需要的可以参考一下
    2022-08-08
  • Python 变量类型及命名规则介绍

    Python 变量类型及命名规则介绍

    Python编程中,变量是用于存放值或对像的容器。而变量的名称可以自定义,基本的命名规则如下
    2013-06-06
  • Python实现子类调用父类的初始化实例

    Python实现子类调用父类的初始化实例

    这篇文章主要介绍了Python实现子类调用父类的初始化实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03

最新评论