当前位置: 首页 > news >正文

python---可变对象、不可变对象

文章目录

  • 1. 不可变类型(Immutable)
    • 1.1、常见的不可变类型
      • 1.1.1、整数(int)
      • 1.1.2、浮点数(float)
      • 1.1.3、布尔值(bool)
      • 1.1.4、字符串(str)
      • 1.1.5、元组(tuple)
      • 1.1.6、frozenset(不可变集合)
    • 1.2、不可变类型的特点
  • 2. 可变类型(Mutable)
    • 2.1、常见的可变类型
      • 2.1.1、列表(list)
      • 2.1.2、字典(dict)
      • 2.1.3、集合(set)
      • 2.1.4、字节数组
    • 2.2、可变类型的特点
  • 3、判断一个对象是可变还是不可变的方法
  • 4、 可变与不可变在函数传参时的区别
    • 4.1、不可变类型
    • 4.2、可变类型
  • 5、总结

在 Python 中,数据类型可以分为 不可变类型(Immutable) 和 可变类型(Mutable),它们的区别在于 对象创建后是否可以修改其值。

1. 不可变类型(Immutable)

不可变类型一旦创建,其值就不能被修改。如果尝试修改,实际上是创建了一个新的对象。

1.1、常见的不可变类型

1.1.1、整数(int)

a = 10
b = a  # b 和 a 指向同一个对象
a = 20  # 修改 a,实际上是创建了一个新对象
print(b)  # 输出 10,b 不变

1.1.2、浮点数(float)

x = 3.14
x = 2.71  # 创建新对象

1.1.3、布尔值(bool)

flag = True
flag = False  # 创建新对象

1.1.4、字符串(str)

s = "hello"
s[0] = 'H'  # 报错!字符串不可变
s = "Hello"  # 可以重新赋值(创建新对象)

1.1.5、元组(tuple)

t = (1, 2, 3)
t[0] = 10  # 报错!元组不可变
t = (10, 2, 3)  # 可以重新赋值(创建新对象)

1.1.6、frozenset(不可变集合)

fs = frozenset([1, 2, 3])
fs.add(4)  # 报错!不可变

1.2、不可变类型的特点

1、修改时会创建新对象,原对象不变。

2、适合作为字典的键(dict key),因为键必须是不可变的。

2. 可变类型(Mutable)

可变类型在创建后,其值可以被修改,而 不会创建新对象。

2.1、常见的可变类型

2.1.1、列表(list)

lst = [1, 2, 3]
lst[0] = 10  # 修改元素,原对象改变
lst.append(4)  # 添加元素,原对象改变

2.1.2、字典(dict)

d = {"a": 1, "b": 2}
d["a"] = 10  # 修改值
d["c"] = 3   # 添加新键值对

2.1.3、集合(set)

s = {1, 2, 3}
s.add(4)  # 修改集合
s.remove(1)

2.1.4、字节数组

ba = bytearray(b'hello')
ba[0] = 72  # 可修改

2.2、可变类型的特点

1、修改时不会创建新对象,直接在原对象上修改。

2、不能作为字典的键(因为键必须是不可变的)。

3、函数传参时需小心,因为修改会影响原对象(类似引用传递)。

3、判断一个对象是可变还是不可变的方法

可以用 id() 查看对象的内存地址
代码示例:

x = [1, 2, 3]  # 可变
print(id(x))   # 输出内存地址
x[0] = 10      # 修改
print(id(x))   # 内存地址不变(可变类型)y = (1, 2, 3)  # 不可变
print(id(y))
y = (10, 2, 3) # 重新赋值
print(id(y))   # 内存地址改变(不可变类型)

4、 可变与不可变在函数传参时的区别

4.1、不可变类型

传参时相当于 值传递,函数内部修改不会影响外部变量
代码示例:

def modify(num):num += 10  # 创建新对象print(num)  # 20a = 10
modify(a)
print(a)  # 仍然是 10

4.2、可变类型

传参时相当于 引用传递,函数内部修改会影响外部变量
代码示例

def modify_list(lst):lst.append(4)  # 修改原对象my_list = [1, 2, 3]
modify_list(my_list)
print(my_list)  # [1, 2, 3, 4]

5、总结

特性不可变类型可变类型
示例int, float, str, tuple, frozensetlist, dict, set, bytearray
是否可修改❌(修改会创建新对象)✅(直接修改原对象)
能否作为字典的键
函数传参类似值传递(不影响外部)类似引用传递(影响外部)
http://www.dtcms.com/a/313709.html

相关文章:

  • SpringBoot学习总结
  • 在不可更改系统上构建数据响应机制的可选策略
  • 彻底屏蔽夸克浏览器更新
  • ORA-12514:TNS: 监听程序当前无法识别连接描述符中请求的服务
  • 【Spring】Bean的生命周期,部分源码解释
  • 【高等数学】第七章 微分方程——第九节 欧拉方程
  • Java基础:代码块/内部类/Lambda函数/常用API/GUI编程
  • LeetCode - 合并两个有序链表 / 删除链表的倒数第 N 个结点
  • 三角洲行动ACE反作弊VT-d报错?CPU虚拟化如何开启!
  • MySQL架构全面理解
  • 克罗均线策略思路
  • 无刷电机母线电容计算
  • SpringBoot AI自动化测试实战案例
  • 大模型能力测评(提示词请帮我把这个项目改写成为python项目)
  • 译|数据驱动智慧供应链的构成要素与关联思考
  • 死锁深度解析:原理、检测与解决之道
  • C++ <type_traits> 应用详解
  • 志邦家居PMO负责人李蓉蓉受邀为PMO大会主持人
  • 【深度学习新浪潮】谷歌新推出的AlphaEarth是款什么产品?
  • ZStack Cloud 5.3.40正式发布
  • 《测试驱动的React开发:从单元验证到集成协同的深度实践》
  • JAVA中的String类方法介绍
  • 【Bluetooth】【Transport层篇】第三章 基础的串口(UART)通信
  • 智能图书馆管理系统开发实战系列(六):Google Test单元测试实践
  • SAP 服务号传输(同环境的不同客户端SCC1,跨环境的STMS)
  • 一个网页的加载过程详解
  • lua中 list.last = last 和list[last]=value区别
  • C语言实现猜数字游戏
  • 多模态大模型综述:BLIP-2详解(第二篇)
  • 问题集000