python赋值与拷贝
序言
看这个贴子的小伙伴们肯定了解了python3各种基础的变量赋值操作。那么接下来我们深入的来了解一下赋值和拷贝之前的区别!
赋值
说明:
赋值操作是将一个变量名指向某个对象的内存地址,而不是创建一个新的对象。赋值后,多个变量名会共享同一个对象。
特点:
1、赋值操作不会创建新对象。
2、修改其中一个变量会影响另一个变量,因为它们指向同一个对象。
a = [1, 2, 3]
b = a # 赋值操作,b 和 a 指向同一个列表对象
b.append(4)
print(a) # 输出: [1, 2, 3, 4]
print(b) # 输出: [1, 2, 3, 4]
if id(a)==id(b):
print(f"a和b是指向同一地址{id(a)}")
如图所示:

拷贝
说明:
拷贝操作会创建一个新的对象,并将原对象的内容复制到新对象中。拷贝后的对象与原对象是独立的,修改其中一个不会影响另一个。
拷贝分两种:
1、浅拷贝
2、深拷贝
浅拷贝
浅拷贝会创建一个新对象,但新对象中的元素仍然是原对象中元素的引用(即只复制第一层)
举例:
import copy
a = [1, 2, [3, 4]]
b = copy.copy(a) # 浅拷贝
print(f"原本的a={a}")
print(f"原本的b={b}")
b.append(5) # 修改第一层,不影响 a
b[2].append(6) # 修改嵌套对象,会影响 a
print(f"改变过后的a={a}") # 输出: [1, 2, [3, 4, 6]]
print(f"改变过后的b={b}") # 输出: [1, 2, [3, 4, 6], 5]
if id(a)!=id(b):
print(f"a与b指向的第一层地址确实不一样,\nid(a)={id(a)},id(b)={id(b)}")
if id(a[2])==id(b[2]):
print("a和b里面的地址仍然相同")
如图所示:

深拷贝
说明:
深拷贝会递归地创建一个新对象,并复制原对象及其所有嵌套对象。深拷贝后的对象与原对象完全独立。
举例:
import copy
a = [1, 2, [3, 4]]
b = copy.deepcopy(a) # 浅拷贝
print(f"原本的a={a}")
print(f"原本的b={b}")
b.append(5) # 修改第一层,不影响 a
b[2].append(6) # 修改嵌套对象,会影响 a
print(f"改变过后的a={a}") # 输出: [1, 2, [3, 4, 6]]
print(f"改变过后的b={b}") # 输出: [1, 2, [3, 4, 6], 5]
if id(a)!=id(b):
print(f"a与b指向的第一层地址确实不一样,\nid(a)={id(a)},id(b)={id(b)}")
if id(a[2])==id(b[2]):
print("a和b里面的地址仍然相同")
else:
print(f"a和b里面的地址不同\nid(a[2])={id(a[2])},id(b[2])={id(b[2])}")

浙公网安备 33010602011771号