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, frozenset | list, dict, set, bytearray |
是否可修改 | ❌(修改会创建新对象) | ✅(直接修改原对象) |
能否作为字典的键 | ✅ | ❌ |
函数传参 | 类似值传递(不影响外部) | 类似引用传递(影响外部) |