Python中:赋值 vs. 浅拷贝
赋值:
在内存中,只有一个列表对象被创建,a和b这两个变量都存储了这个对象的内存地址(引用)。
浅拷贝:新对象本身在内存中有新的存储空间,但其中的可变元素(如果有)和原始对象中的可变元素共享内存地址。
这样的定义根本理解不了,请问是否有对应的内存图进行说明呢?
Python中:赋值 vs. 浅拷贝
赋值:
在内存中,只有一个列表对象被创建,a和b这两个变量都存储了这个对象的内存地址(引用)。
浅拷贝:新对象本身在内存中有新的存储空间,但其中的可变元素(如果有)和原始对象中的可变元素共享内存地址。
这样的定义根本理解不了,请问是否有对应的内存图进行说明呢?
当然,下面是通过Markdown格式提供的内存图,用于说明Python中赋值和浅拷贝的区别。
内存布局:
+----------+
| List |
| [1, 2, 3]|
+----------+
^ ^
| |
a ---- b ----
- **解释**:在赋值操作中,`a` 和 `b` 都指向同一个列表对象。这意味着对 `a` 或 `b` 所做的任何修改都会影响到另一个变量,因为它们引用的是同一个内存地址。
### 浅拷贝
内存布局:
+----------+ +----------+
| List | | List |
| [1, 2, 3]| < | [1, 2, 3]| (元素引用相同)
+----------+ +----------+
^ ^
| |
a ---- b ----
a
和 b
分别指向两个不同的列表对象。然而,这两个列表对象中的元素(如果是可变类型,如列表、字典等)仍然共享相同的内存地址。这意味着如果你修改一个列表中的可变元素(比如 a[1] = 4
),这个修改不会影响到另一个列表对象的结构(因为列表对象本身是独立的),但是如果你修改了被共享的可变元素的内容(比如列表中的另一个列表),那么这个修改将会影响到所有引用这个可变元素的列表对象。希望这些内存图能帮助你更好地理解赋值和浅拷贝在Python中的区别。
15 回答8.2k 阅读
4 回答4.4k 阅读✓ 已解决
4 回答4k 阅读
1 回答3.2k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答1.5k 阅读✓ 已解决
https://github.com/bterwijn/memory_graph#copying
根据这个你下载下来看看:

然后这个网站也有图文并茂的讲解,你可以看看理解一下,不过是英文的:
copy-python-deep-copy-shallow-copy