Python 深拷贝和浅拷贝
-
浅拷贝:指的是重新分配一块内存,创建一个新的对象,里面的元素是原对象里的各个子对象的引用。原来变量的内存不一样。
-
深拷贝:指的是重新分配一块内存,创建一个新的对象,并且将原对象的元素以递归方式通过创建新的子对象拷贝到新对象中,新对象和原对象没有任何关联。
-
浅拷贝:使用数据类型本身的构造器。通过切片来操作可变类型的序列。
- 元组不是浅拷贝,它通过切片操作,但不是浅拷贝。开辟内存存储是对原对象的引用,并没有创建新的对象来存储原对象的子对象的引用,相反它会返回一个指向相同元组的引用。
-
和赋值的区别就是赋值把原对象的引用给新对象
对应浅拷贝来说,只是在内存中重新开辟了一个空间存放一个新列表,但是新列表中元素与原列表中的元素是公用的。
深拷贝deepcopy===》对于深拷贝来说,列表是在内存中重新创建的,列表中可变的数据类型是重新创建的,列表中的不可变的数据类型是公用的
Python值传递还是引用传递
-
Python
中一切事物皆对象,变量是对对象在内存中的存储和地址的抽象。 -
python
参数传递,统一都是引用传递,但是针对可变类型和不可变类型我们要区分。- 可变类型(
list、set、dict
):可修改参数值从而修改原对象的值- 类似于c语言中引用传递
- 不可变类型(
bumber、string、tuple
):参数变量与原变量指向同一内存地址,对于不可变类型对象是无法修改原对象。- 重新赋值从而不影响原对象的值
- 类似于c语言中值传递
- 可变类型(
-
问题:
python
引用传递,怎么样将两变量指向不同的内存地址?-
通过浅拷贝和深拷贝的方式!
-
在没有
copy
模块,只是简单的赋值操作,修改b
相当于修改a。a = [1, 2, 3] b = a 修改b相当于修改a
-
有copy模块,和deepcopy模块,两变量内存地址是不一样的。
-
-
-
问题:浅拷贝和深拷贝的区别?
-
对于浅拷贝:内存重新创建或开辟了一个新的空间,存放新列表,新元素中元素与原对象里的元素是公用的。
修改其中一个变量都会影响原对象变量的值。
-
对于深拷贝:列表在内存中重新创建或开辟了一个空间,可变数据类型是完完整整重新创建一个新对象,修改不改变原对象,互不影响,对于列表中的不可变类型的元素却是公用的
-