当前位置: 首页 > 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/313134.html

相关文章:

  • Pytorch 报错-probability tensor contains either ‘inf‘, ‘nan‘ or element < 0 解决方案
  • Arrays.asList() add方法报错java.lang.UnsupportedOperationException
  • 8月3日星期日今日早报简报微语报早读
  • 多线程(四) ~ wait,join,sleep及单例与工厂模式
  • 图像识别区分指定物品与其他物体
  • 【华为机试】815. 公交路线
  • NumPy库学习(三):numpy在人工智能数据处理的具体应用及方法
  • 机器学习sklearn:支持向量机svm
  • Vue3 其它Composition API
  • Linux网络编程 --- 多路转接select
  • 推送本地项目到Gitee远程仓库
  • Selenium Web 自动化
  • 优选算法 力扣 202.快乐数 快慢双指针 解决带环问题 C++解题思路 每日一题
  • ThinkPHP5x,struts2等框架靶场复现
  • Coin Combinations II(Dynamic Programming)
  • LLM - AI大模型应用集成协议三件套 MCP、A2A与AG-UI
  • 用 Eland 在 Elasticsearch Serverless 部署 Learning-to-Rank 排序模型
  • 数据,正在成为AI大模型最后的护城河
  • leetcode 2106. 摘水果 困难
  • Rust 同步方式访问 REST API 的完整指南
  • 道格拉斯-普克算法 - 把一堆复杂的线条变得简单,同时尽量保持原来的样子
  • python---赋值、浅拷贝、深拷贝
  • 【C 学习】03-你的第一个C程序
  • 上位机知识篇---脚本文件
  • Linux环境下使用Docker搭建多服务环境
  • Corrosion2靶场
  • xxljob总结
  • Obsidian结合CI/CD实现自动发布
  • 1、docker容器命令 | 生命周期管理
  • NX969NX972美光固态闪存NX975NX977