Python中可变对象和不可变对象的使用详解

 更新时间:2025年12月29日 09:31:30   作者:Peter-Lu  
本文详细介绍了Python中可变对象(如列表、字典和集合)与不可变对象(如字符串、整数和元组)的特性,以及它们在函数传递中的行为差异,感兴趣的可以了解一下

最近面试被问到了这个问题,写个帖子解释一下可变对象和不可变对象

1. 对象可变性简介

在Python中,每个变量都是一个对象,每个对象都具有其创建后是否允许修改的属性,这种特性称为对象的可变性。它影响对象在传递给函数、用于表达式或存储在数据结构中时的行为。

定义

  • 可变对象:创建后可以改变的对象。例子包括列表、字典、集合和用户定义的对象。
  • 不可变对象:一旦创建后不允许被修改的对象。例子包括整数、浮点数、字符串、元组和冻结集合。

2. 不可变对象的特性

不可变对象包括数字(整数和浮点数)、字符串、元组等。这些对象的共同特点是一旦创建,它们的内存中的数据不可改变。

2.1 字符串

字符串是不可变对象的典型例子。当尝试修改字符串的内容时,Python并不是修改原有的字符串,而是创建一个新的字符串对象。

str1 = "Hello"
# 尝试更改字符串的内容
str2 = str1.replace('H', 'J')
print(str1)  # 输出 Hello,原字符串未改变
print(str2)  # 输出 Jello,创建了一个新字符串

2.2 整数和浮点数

整数和浮点数也是不可变对象。每次对数字进行修改,实际上是生成了一个新的数字对象。

x = 10
y = x
x = x + 1
print(y)  # 输出 10,y 仍然指向原来的整数对象
print(x)  # 输出 11,x 现在指向一个新的整数对象

2.3 元组

元组的不可变性示例

不能直接更改元组中的元素。如果尝试修改元组中的某个元素,Python 将抛出一个错误。

tup = (1, 2, 3)
try:
    tup[0] = 100  # 尝试修改元组的第一个元素
except TypeError as e:
    print(e)  # 输出错误信息(TypeError)

元组内含可变对象

尽管元组本身是不可变的,但如果元组中包含可变对象,如列表,这些可变对象内部的内容是可以被修改的。这种情况下,元组的不可变性只适用于顶层结构,不影响内部元素的可变性。

tup_with_list = (1, [2, 3], 4)
tup_with_list[1].append(5)
print(tup_with_list)  # 输出 (1, [2, 3, 5], 4)

3. 可变对象的特性

可变对象如列表、字典和集合允许在对象创建后修改其内容。

3.1 列表

列表是最常见的可变对象之一。可以在列表中添加、删除或更改元素,而无需创建一个新的列表对象。

lst = [1, 2, 3]
lst.append(4)
print(lst)  # 输出 [1, 2, 3, 4],列表内容被修改

3.2 字典

字典也是一个可变对象。可以随时添加、删除或修改字典中的键值对。

dic = {'a': 1, 'b': 2}
dic['c'] = 3
print(dic)  # 输出 {'a': 1, 'b': 2, 'c': 3},字典已更新

3.3 集合

集合的可变性示例

创建一个简单的集合,演示如何向集合中添加和删除元素。

# 创建一个初始集合
my_set = {1, 2, 3}
print("初始集合:", my_set)

# 添加、移除元素
my_set.add(4)
my_set.remove(2)
print("操作后的集合:", my_set)

集合的操作限制

尽管集合是可变的,但也有一些操作上的限制。例如,集合只能包含不可变(可哈希)的对象。因此不能将列表或另一个集合作为元素添加到集合中。

nested_set = {1, 2, 3}
try:
    nested_set.add([4, 5, 6])  # 尝试添加列表到集合中
    # nested_set.add({7, 8, 9})  # 尝试添加另一个集合到集合中
except TypeError as e:
    print(e)  # 输出错误信息

4. 函数中的对象传递

理解Python中的参数传递方式——按引用传递(实际上是对象的引用地址传递)——是理解可变与不可变对象的关键。

4.1 不可变对象的传递

向函数传递不可变对象时,对该对象的任何修改都不会影响原始对象,因为实际上是创建了一个新的对象。

def update_number(n):
    n += 10

x = 5
update_number(x)
print(x)  # 输出 5,原始值未改变

4.2 可变对象的传递

相反,传递可变对象时,函数内对对象的修改将影响原始对象。

def update_list(lst):
    lst.append(4)

my_list = [1, 2, 3]
update_list(my_list)
print(my_list)  # 输出 [1, 2, 3, 4],原始列表被修改

到此这篇关于Python中可变对象和不可变对象的使用详解的文章就介绍到这了,更多相关Python 可变对象和不可变对象内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 十个Python经典小游戏的代码合集

    十个Python经典小游戏的代码合集

    这篇文章主要为大家分享十个Python经典的小游戏代码,非常适合Python初学者练手。文中的示例代码讲解详细,感兴趣的小伙伴可以尝试一下
    2022-05-05
  • 基于Python实现身份证信息识别功能

    基于Python实现身份证信息识别功能

    身份证是用于证明个人身份和身份信息的官方证件,在现代社会中,身份证被广泛应用于各种场景,如就业、教育、医疗、金融等,它包含了个人的基本信息,本文给大家介绍了如何基于Python实现身份证信息识别功能,感兴趣的朋友可以参考下
    2024-01-01
  • ssh批量登录并执行命令的python实现代码

    ssh批量登录并执行命令的python实现代码

    有个任务是在这些电脑上执行某些命令,者说进行某些操作,比如安装某些软件,拷贝某些文件,批量关机等。如果一台一台得手工去操作,费时又费力,如果要进行多个操作就更麻烦啦
    2012-05-05
  • python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)

    python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)

    UDP,用户数据报传输协议,它位于TCP/IP协议的传输层,是一种无连接的协议,它发送的报文不能确定是否完整地到达了另外一端
    2014-04-04
  • Python实现通讯录功能

    Python实现通讯录功能

    这篇文章主要为大家详细介绍了Python实现通讯录功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • python scatter绘制散点图

    python scatter绘制散点图

    这篇文章主要介绍了python scatter绘制散点图,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-06-06
  • Python将list元素转存为CSV文件的实现

    Python将list元素转存为CSV文件的实现

    这篇文章主要介绍了Python将list元素转存为CSV文件的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • python使用tkinter调整label背景颜色的测试

    python使用tkinter调整label背景颜色的测试

    这篇文章主要介绍了python使用tkinter调整label背景颜色的测试方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • YOLOV5超参数介绍以及优化策略

    YOLOV5超参数介绍以及优化策略

    yolov5提供了一种超参数优化的方法,这篇文章主要给大家介绍了关于YOLOV5超参数介绍以及优化策略的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或工具有一定的参考学习价值,需要的朋友可以参考下
    2022-09-09
  • 详解Numpy数组转置的三种方法T、transpose、swapaxes

    详解Numpy数组转置的三种方法T、transpose、swapaxes

    这篇文章主要介绍了详解Numpy数组转置的三种方法T、transpose、swapaxes,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05

最新评论