一个诡异的现象揭秘背后的原理Python对象的分两类1. 可变对象(Mutable)2. 不可变对象(Immutable)3.关键区别如何创建真正的副本?1. 浅拷贝(shallow copy)2. 深拷贝(deep copy)
让我们先看一段代码:
x = ['a','b','c']
y = x
y[1] = 'z'
print(y)
# ['a', 'z', 'c']
print(x)
# ['a', 'z', 'c']
纳尼?我们只修改了变量 y,为什么 x 的值也跟着改变了呢?🤔
这是因为 Python 中的赋值操作 y = x
创建的是引用,而不是复制。简单来说:
让我们用实例来说明:
# 可变对象示例
x = ['a', 'b']
y = x
y.append('c') #修改了y,加上一个元素c
print(y)
#['a', 'b', 'c']
print(x) # x变了
#['a', 'b', 'c']
# 不可变对象示例
x = "hello"
y = x
y = "world" #修改了y,改为"world"
print(y)
#world
print(x) # x没变
#hello
可变对象:
不可变对象:
特殊情况 - 元组包含可变对象:
x = ([1, 2], 3)
y = x
y[0].append(4)
print(x) # ([1, 2, 4], 3)
# 虽然元组不可变,但其中的列表是可变的
([1, 2, 4], 3)
如果你想要一个完全独立的副本,有两种方法:
x = ['a','b','c']
y = x.copy() # 或使用 list(x)
import copy
x = [[1, 2], [3, 4]]
y = copy.deepcopy(x)
💡 提示:处理嵌套数据结构时,建议使用深拷贝,它能确保创建完全独立的副本。
你有遇到过类似的困惑吗?欢迎在评论区分享你的经验~