在Python中,不可变(immutable)数据类型是指一旦创建后,其内容不能被修改的数据类型。
- A.
list:可变(mutable),可以添加、删除、修改元素; - B.
dict:可变,键值对可以增删改; - C.
set:可变,元素可以添加或移除; - D.
tuple:✅ 不可变,创建后不能修改其元素(包括增、删、改),若包含可变对象(如列表),该对象自身可变,但tuple的引用不可变。
因此,正确答案是:D. tuple
# 示例验证t=(1,2,3)# t[0] = 99 # ❌ TypeError: 'tuple' object does not support item assignment# t.append(4) # ❌ AttributeError: 'tuple' object has no attribute 'append'# 对比 listl=[1,2,3]l[0]=99# ✅ 允许l.append(4)# ✅ 允许是的,即使元组中包含一个列表,整个元组本身仍然被视为不可变类型。
✅ 原因:
“不可变”指的是元组对象自身的结构和元素引用不可更改——即不能增删元素、不能对元组索引赋值、不能调用修改方法(如append())。但若元组中某个元素本身是可变对象(如list、dict、set),该嵌套对象的内容仍可被原地修改,因为元组只保存对其的引用,不控制其内部状态。
⚠️ 注意:这不违背元组的不可变性,因为元组并未“改变自身引用”,只是它所引用的可变对象发生了变化。
🔍 示例说明:
t=(1,[2,3],"hello")print(t)# (1, [2, 3], 'hello')# ✅ 允许:修改嵌套列表的内容(列表自身可变)t[1].append(4)print(t)# (1, [2, 3, 4], 'hello') —— 元组内容看似变了,但元组对象未被“重新赋值”或“结构调整”# ❌ 禁止:试图替换元组中的元素# t[1] = [5, 6] # TypeError: 'tuple' object does not support item assignment# ❌ 禁止:试图给元组添加元素# t += (99,) # 这会创建新元组,原元组不变;原t对象地址已变(若重新赋值)# 验证身份(id):original_id=id(t)t=t+(99,)# 创建新元组 → 新idprint(id(t)==original_id)# False → 原元组未被修改,只是变量指向了新对象📌 关键结论:
- 元组的不可变性是浅层的(shallow immutability),仅保证其直接元素的引用不可变;
- 不保证嵌套可变对象的深层内容不可变;
- 正因如此,含可变对象的元组不能作为字典的键(除非该元组在生命周期内其嵌套可变对象未被修改,但Python不检查运行时内容,故仍会报错):
d={}# d[t] = "value" # ❌ TypeError: unhashable type: 'list' —— 因为t含list,整体不可哈希