1.深浅拷贝(??重要)1.1浅拷贝1.1.1定义只拷贝第一层的内存地址1.1.2浅拷贝实例Assignment说明在浅拷贝之前,说明赋值和赋值共享相同的内存空间,而变量的值发生变化。另一个赋值变量也改变了多个变量名指向同一个内存空间3.#Listexample4.lst=[1,1,3]5.lst1=lst6.lst1.append(4)//正常思维理解应该是lst1改变后,lst不会改变,但是赋值是多个变量名指向同一个内存空间,所以只要一个变量改变,另一个变量也跟着改变7.print(lst,lst1)8.[1,1,3,4][1,1,3,4]11.#字典示例12.dic={'k1':1,'k1':1}13.dic1=dic14.dic1.update({'k1':111})15.print(dic,dic1)16.{'k1':1,'k1':111}{'k1':1,'k1':111}赋值原理图浅拷贝只拷贝第一层内存地址1。#链表有两种浅拷贝方式2.lst=[1,1,3]3.new_lst=lst.copy()6.lst=[1,1,3]7.new_lst=lst[:]浅拷贝只拷贝第一层的内存空间地址,浅拷贝的两个变量是独立的内存空间,不再共享同一个内存paceaddress3.#ListExample1第二层没有嵌套在list元素中4.lst=[1,1,3]5.new_lst=lst.copy()6.new_lst.append(4)7.print(lst,new_lst)8.[1,1,3][1,1,3,4]9.#浅拷贝lst和new_lst的结果不同12.print(id(lst),id(new_lst))13.14058461476717614058461477434414.#浅拷贝中lst和new_lst的内存空间地址不同17.#列表示例1第二层元素嵌套在列表中18.lst=[1,1,[3,4,5]]19.new_lst=lst.copy()20.new_lst.append(6)21.print(lst,new_lst)22.[1,1,[3,4,5]][1,1,[3,4,5],6]25.打印(id(lst),id(new_lst))26.14043187513095114043187496391129.打印(id(lst[1]),id(new_lst[1]))30.#shallowcopy只复制第一层的内存空间,所以两个列表的第二层嵌套元素的值内存空间是一样的复制多层元素示意图(向第二层添加元素)1.1.3浅拷贝总结1.浅拷贝只拷贝第一层的内存空间地址1.浅拷贝,修改第一层元素或者增加元素,都是把旧指针改成新点,两个变量不影响彼此。3、浅拷贝修改第二层及以下元素或增加元素,修改两个变量共享的值。这时,修改会影响两个变量。1.1.4浅拷贝坑1.lst=[1,3,[4,5],6]2.lst1=lst3.lst1=lst[:]4.lst1[-1]=[8,9]5.lst1[-1]。append([0])#Numberscannotbeappended6.print(lst,lst1,lst1)7.AttributeError:'int'objecthasnoattribute'append'1.2深拷贝1.2.1为不可变数据类型定义共享内存空间,可变数据类型开辟新的内存空间,无论嵌套多少层都是一样的原理1.2.2深拷贝语法Importcopycopy.deepcopy()1.2.3深拷贝示例1.importcopy2.lst=[1,1,[3,4]]3.new_lst=copy.deepcopy(lst)4.print(id(lst[0]),id(new_lst[0]))#lst[0]为1,1为整数,不可变数据类型-->共享内存空间地址5.446477716444647771648.print(id(lst[-1]),id(new_lst[-1]))9.140663166316984140663166494088#lst[-1]是[3,4],[3,4]是列表,是可变数据类型-->新开辟的内存空间地址1.2.4深拷贝示意图1.2.5深拷贝小结在深拷贝中,不可变数据类型共享内存空间地址,可变数据类型开辟新的内存空间,无论嵌套多少层
