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])}")
posted @ 2025-03-18 15:16  CodeCraftsMan  阅读(53)  评论(0)    收藏  举报