在Python的世界里,数据就像有不同性格的“精灵”:有的一旦诞生就坚守本心,无论如何尝试修改,核心都纹丝不动;有的却灵活多变,能在原地不断调整形态,甚至换了模样还保持着最初的“身份”。这种看似不起眼的差异,却直接决定了代码运行的逻辑、内存的使用方式,甚至是新手最容易踩的坑——比如明明修改了变量,结果却和预期完全相反。理解这些“精灵”的性格,也就是可变对象与不可变对象,是真正读懂Python运行机制的关键,也是从“会写代码”到“写好代码”的必经之路。
不可变对象示例
a = 10
a += 5
a
s = "hello"
s += " world"
t = (1, 2, 3)
t[0] = 10
t = (1, [2, 3])
可变对象示例
lst = [1, 2, 3]
lst.append(4)
[1, 2, 3, 4]
lst
d = {"name": "小明"}
d["age"] = 18
s = {1, 2, 3}
s.add(4)
解答过程:
# 验证整数(不可变)a = 10print(id(a)) # 输出:如140708467224432a += 5print(id(a)) # 输出:如140708467224592(地址变化)# 验证列表(可变)lst = [1, 2, 3]print(id(lst)) # 输出:如2282150767104lst.append(4)print(id(lst)) # 输出:2282150767104(地址不变)
t = (1, [2, 3])t[1].append(4) # 可行,修改的是列表(可变对象)的内容print(t) # 输出:(1, [2, 3, 4])t[0] = 10# 报错,试图修改元组元素的指向(不可变)
# 不可变对象(整数)传参defchange_num(x): x += 5return xnum = 10change_num(num)print(num) # 输出:10(外部变量未变)# 可变对象(列表)传参defchange_list(l): l.append(4)return llst = [1, 2, 3]change_list(lst)print(lst) # 输出:[1, 2, 3, 4](外部变量已变)
l = lst.copy()