诸如list的可变类型,变量赋值时原变量与新变量指向同一对象
1. 对象引用
在 Python 中,变量保存的不是对象本身,而是对对象的引用。赋值操作(例如 a = b
)会复制引用,而不是创建新的对象。这意味着 a
和 b
指向同一块内存中的对象,因此对可变对象的修改会在所有指向该对象的变量中生效。
a = [1, 2, 3]
b = a # b 和 a 指向同一个对象
b[0] = 99
print(a) # 输出: [99, 2, 3]
2. 可变和不可变类型
- 不可变类型:包括
int
(整数)、float
(浮点数)、str
(字符串)、tuple
(元组)等。这些对象一旦创建,其内容就无法改变。每次尝试修改会创建一个新对象,而不会改变原有对象。python x = 10 y = x y = 20 print(x) # 输出: 10,不受 y 修改的影响
- 可变类型:包括
list
(列表)、dict
(字典)、set
(集合)等。这些对象可以直接修改其内容,不需要创建新对象,因此所有指向该对象的引用都会受到影响。
3. 浅拷贝与深拷贝
- 浅拷贝:只复制对象的本身,但对于对象中的嵌套可变对象,仅复制其引用。也就是说,浅拷贝后的对象与原始对象共享内部嵌套对象。
import copy original = [[1, 2], [3, 4]] shallow_copy = copy.copy(original) shallow_copy[0][0] = 99 print(original) # 输出: [[99, 2], [3, 4]]
- 深拷贝:复制对象及其所有嵌套对象,确保新对象完全独立于原始对象。深拷贝不会共享任何嵌套对象的引用。
python deep_copy = copy.deepcopy(original) deep_copy[0][0] = 42 print(original) # 输出: [[99, 2], [3, 4]]
总结
- 引用:Python 中变量是对象的引用,赋值是引用的复制。
- 可变与不可变类型:不可变类型一旦创建无法更改;可变类型可以更改且会影响所有引用。
- 浅拷贝与深拷贝:浅拷贝共享嵌套对象引用,深拷贝完全独立,适用于复杂嵌套结构的复制。
发表回复