浅拷贝和深拷贝的例子
时间: 2024-12-13 15:12:40 浏览: 2
浅拷贝和深拷贝主要区别在于对嵌套数据结构的处理。下面是一些例子来帮助理解:
**浅拷贝示例**:
```python
import copy
# 原始列表,其中包含一个可变元素(另一个列表)
original_list = ['a', 'b', ['c', 'd']]
# 浅拷贝
shallow_copy = original_list.copy()
print(id(original_list), id(shallow_copy)) # 输出两个不同的地址
shallow_copy[2][0] = 'e' # 修改原列表的嵌套部分
print(original_list) # 输出:['a', 'b', ['e', 'd']]
```
这里可以看到,虽然浅拷贝的地址不同,但由于元素不是全新的,修改了嵌套列表会影响原始列表。
**深拷贝示例**:
```python
# 深拷贝
deep_copy = copy.deepcopy(original_list)
print(id(original_list), id(deep_copy)) # 输出两个不同的地址
deep_copy[2][0] = 'f' # 修改深拷贝的嵌套部分
print(original_list) # 输出:['a', 'b', ['c', 'd']] 未受影响
```
在这个深拷贝的例子中,即使改变了深拷贝的嵌套元素,原始列表也不会受到影响。
相关问题
c++浅拷贝和深拷贝的例子
浅拷贝和深拷贝是在C++中涉及对象拷贝构造函数和赋值运算符重载的概念。
浅拷贝是指将对象的成员变量简单地逐位复制到另一个对象,这会导致两个对象的成员变量共享同一块内存。而深拷贝则是创建一个新的对象,并将原对象的成员变量逐位复制到新对象中,两个对象的成员变量分别占用不同的内存空间。
下面是一个示例代码:
```cpp#include <iostream>
#include <cstring>
class String {
private:
char* data;
int size;
public:
// 构造函数 String(const char* str) {
size = strlen(str);
data = new char[size +1];
strcpy(data, str);
}
// 拷贝构造函数 String(const String& other) {
size = other.size;
data = new char[size +1];
strcpy(data, other.data);
}
// 赋值运算符重载 String& operator=(const String& other) {
if (this == &other) {
return *this;
}
delete[] data;
size = other.size;
data = new char[size +1];
strcpy(data, other.data);
return *this;
}
// 析构函数 ~String() {
delete[] data;
}
void print() {
std::cout << data << std::endl;
}
};
int main() {
String str1("Hello");
String str2 = str1; // 浅拷贝 String str3("World");
str3 = str1; // 深拷贝 str1.print(); // 输出 "Hello"
str2.print(); // 输出 "Hello"
str3.print(); // 输出 "Hello"
return0;
}
```
在上面的示例中,`String` 类包含了一个字符数组 `data` 和一个整数 `size`,用于存储字符串和字符串长度。在构造函数中,我们使用 `new` 运算符为 `data` 动态分配内存,并将传入的字符串复制到 `data` 中。在拷贝构造函数中,我们也是通过动态分配内存并复制成员变量来实现拷贝。在赋值运算符重载函数中,我们首先释放原有的内存,然后再进行深拷贝。
在 `main` 函数中,我们创建了三个 `String` 对象:`str1`、`str2` 和 `str3`。其中,`str2` 是通过拷贝构造函数进行浅拷贝得到的,而 `str3` 是通过赋值运算符重载进行深拷贝得到的。最后,我们分别打印了三个对象的内容,可以看到浅拷贝的对象共享同一块内存,而深拷贝的对象拥有独立的内存空间。
分别举一个浅拷贝和深拷贝的例子
好的,让我来回答您的问题。
浅拷贝是指在拷贝一个对象时,只复制其指针或引用等浅层次的内容,而不会复制其指向的堆内存,因此原本拷贝的对象和被拷贝的对象会指向同一块堆内存。例如:
```
let arr1 = [1, 2, 3];
let arr2 = arr1; // 这是浅拷贝
arr2.push(4); // 修改 arr2 的值
console.log(arr1); // 输出 [1, 2, 3, 4]
```
在这个例子中,虽然我们将 arr1 赋值给了 arr2,但它们实际上指向的是同一个数组对象,因此对 arr2 进行 push 操作会影响到 arr1。
深拷贝则是指在拷贝一个对象时,不仅复制其浅层次的指针和引用,还要递归复制对象内部所有的值和引用等深层次的内容,使原始对象和拷贝对象完全独立,互不影响。例如:
```
let obj1 = {a: 1, b: {c: 2}};
let obj2 = JSON.parse(JSON.stringify(obj1)); // 这是深拷贝
obj2.b.c = 3; // 修改 obj2 的值
console.log(obj1); // 输出 {a: 1, b: {c: 2}}
```
在这个例子中,我们使用 JSON 序列化和反序列化的方式来进行深拷贝,最终得到的 obj2 与 obj1 是完全独立的两个对象,它们的属性值互不影响。
阅读全文