诸如list的可变类型,变量赋值时原变量与新变量指向同一对象

1. 对象引用

在 Python 中,变量保存的不是对象本身,而是对对象的引用。赋值操作(例如 a = b)会复制引用,而不是创建新的对象。这意味着 ab 指向同一块内存中的对象,因此对可变对象的修改会在所有指向该对象的变量中生效。

   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 中变量是对象的引用,赋值是引用的复制。
  • 可变与不可变类型:不可变类型一旦创建无法更改;可变类型可以更改且会影响所有引用。
  • 浅拷贝与深拷贝:浅拷贝共享嵌套对象引用,深拷贝完全独立,适用于复杂嵌套结构的复制。