深拷贝和浅拷贝的区别?

JavaScript015

深拷贝和浅拷贝的区别?,第1张

1、浅拷贝可以使用列表自带的copy()函数(如list.copy()),或者使用copy模块的copy()函数。深拷贝只能使用copy模块的deepcopy(),所以使用前要导入:from copy import deepcopy。

2、 如果拷贝的对象里的元素只有值,没有引用,那浅拷贝和深拷贝没有差别,都会将原有对象复制一份,产生一个新对象,对新对象里的值进行修改不会影响原有对象,新对象和原对象完全分离开。

3、 如果拷贝的对象里的元素包含引用(像一个列表里储存着另一个列表,存的就是另一个列表的引用),那浅拷贝和深拷贝是不同的,浅拷贝虽然将原有对象复制一份。

但是依然保存的是引用,所以对新对象里的引用里的值进行修改,依然会改变原对象里的列表的值,新对象和原对象完全分离开并没有完全分离开。而深拷贝则不同,它会将原对象里的引用也新创建一个,即新建一个列表,然后放的是新列表的引用,这样就可以将新对象和原对象完全分离开。

浅拷贝就是指对象复制的时候只复制一层;深拷贝是指复制对象的所有层级。

深拷贝和浅拷贝,主要是对象发生复制的时候,根据复制的层级不同来区分的。很多人在这里经常变量赋值发生混淆。对于JavaScript数组等复杂的数据类型来说,将其赋值给其它变量,其实只是复制了对象的地址给它,两个变量指向的是同一个对象,因此普通的赋值既不是深拷贝也不是浅拷贝。

深拷贝和浅拷贝需要注意的地方就是可变元素的拷贝:

在浅拷贝时,拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的可变元素的地址是相同的,也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去。

而是和原对象里的可变元素指向同一个地址,所以在新对象或原对象里对这个可变元素做修改时,两个对象是同时改变的,但是深拷贝不会这样,这个是浅拷贝相对于深拷贝最根本的区别。

深拷贝和浅拷贝的区别如下:

浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址。

深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存,使用深拷贝的情况下,释放内存的时候不会因为出现浅拷贝时释放同一个内存的错误。

Python的语句:

不同于C+ +等编程语言。Python的语句末尾不需要加分号表示语句结束,直接换行即可。

另外很重要的一点,就是使用缩进表示语句块之间的逻辑关系,而不用大括号。这两个特点既保持代码可读性,又减少符号输入提高效率。

一个语法上自成体系的单位,它由一个词或句法上有关连的一组词构成,表达一种主张、疑问、命令、愿望或感叹。当语句数超过一条时, 需要采用语句块。

语句块就是由块标识符begin-end或fork-join界定的一组行为描述语旬。语句块就相当于给块中的一组行为描述语句进行打包,使之在形式上类似于一条语询。语句块的具体功能是通过语句块中所包含的描述语句的执行而得以实现的。

当语句块中只包含一条语句时,可以直接写这条语句,此时块标识符可以缺省。语句块包括串行语句块(begin-end) 和并行语句块(fork-join) 两种。