首页 > 编程语言 >详解Python中的浅复制与深复制

详解Python中的浅复制与深复制

时间:2023-06-09 19:32:52浏览次数:34  
标签:详解 变量 Python 元素 列表 复制 copy append


列表对象的copy()方法返回列表的浅复制。所谓浅复制,是指生产一个新的列表,并且把原列表中所有元素的引用都复制到新列表中。如果原列表中只包含整数、实数、复数等基本类型或元组、字符串这样的不可变类型,一般是没有问题的。但是,如果原列表中包含列表之类的可变数据类型,由于浅复制时只是把子列表的引用复制到新列表中,这样修改任何一个都会影响另外一个。例如:

>>> x = [1, 2, [3, 4]] #原列表中包含子列表
>>> y = x.copy() #浅复制
>>> x
[1, 2, [3, 4]]
>>> y  #两个列表中的内容看起来完全一样
[1, 2, [3, 4]]
>>> y[2].append(5) #为新列表中的子列表追加元素
>>> y
[1, 2, [3, 4, 5]]
>>> x  #原列表中的子列表也被修改了
[1, 2, [3, 4, 5]]
>>> x[0] = 6  #整数、实数等不可变类型不受此影响
>>> x
[6, 2, [3, 4, 5]]
>>> y
[1, 2, [3, 4, 5]]
>>> y.append(6)  #在新列表尾部追加元素
>>> y
[1, 2, [3, 4, 5], 6]
>>> x #原列表不受影响
[6, 2, [3, 4, 5]]

列表对象的copy()方法和切片操作与标准库copy中的copy()函数一样都是返回浅复制,如果想避免上面代码演示的问题,可以使用标准库copy中的deepcopy()函数实现深复制。所谓深复制,是指对原列表中的元素进行递归,把所有的值都复制到新列表中,对嵌套的子列表不仅仅是复制引用。这样一来,新列表和原列表是互相独立,修改任何一个都不会影响另外一个。

>>> import copy
>>> x = [1, 2, [3, 4]]
>>> y = copy.deepcopy(x) #深复制
>>> y
[1, 2, [3, 4]]
>>> x[2].append(5) #为原列表中的子列表追加元素
>>> x
[1, 2, [3, 4, 5]]
>>> y  #新列表中的子列表不受影响
[1, 2, [3, 4]]
>>> y.append(6) #在新列表尾部追加元素
>>> y
[1, 2, [3, 4], 6]
>>> x #原列表不受影响
[1, 2, [3, 4, 5]]

不管是浅复制还是深复制,与列表对象的直接复制都是不一样的情况,这一点是必须注意的。下面的代码把同一个列表赋值给两个不同的变量,这两个变量是互相独立的,修改任何一个都不会影响另外一个。

>>> x = [1, 2, [3, 4]]
>>> y = [1, 2, [3, 4]] #把同一个列表对象赋值给两个变量
>>> x.append(5)
>>> x[2].append(6)
>>> x
[1, 2, [3, 4, 6], 5]
>>> y
[1, 2, [3, 4]]

下面的代码演示的是另外一种情况,把一个列表变量赋值给另外一个变量,这样的话两个变量指向同一个列表对象,对其中一个做的任何修改都会立刻在另外一个变量得到体现。

>>> x = [1, 2, [3, 4]]
>>> y = x #两个变量指向同一个列表
>>> x[2].append(5)
>>> x.append(6)
>>> x[0] = 7
>>> x
[7, 2, [3, 4, 5], 6]
>>> y #对x做的任何修改,y都会得到影响
[7, 2, [3, 4, 5], 6]

标签:详解,变量,Python,元素,列表,复制,copy,append
From: https://blog.51cto.com/u_9653244/6450801

相关文章

  • Python实现图像空域随机水印加入与提取
    本文要点在于Python扩展库pillow中Image类的运用。图像空域随机水印的主要思路在于:在原始图像中随机选取一些位置替换为水印图片中的非背景像素,同时生成日志文件记录替换的位置和水印中像素位置的对应关系,然后可以根据加入水印的图片和日志文件来提取和验证水印。fromosimportre......
  • Python泛型函数与单分发器
    这里的泛型函数是指由一组为不同类型参数执行相似操作的函数组成的函数,具体调用哪一个函数的实现取决于分发算法和参数类型。Python单分发器是实现泛型函数的一种形式,由一个单一参数来决定选择和调用哪个函数。下面的代码演示了单分发器泛型函数的有关用法:fromfunctoolsimportsi......
  • 列表元素循环移位中Python切片的妙用
    之前有个文章中介绍了列表循环移位的3中方法其中第二种方法虽然更直接地翻译了题目的要求,但是显得还是有点啰嗦,如果充分利用Python中的切片技术,可以写成下面更简洁的形式:>>>defdemo(lst,k):x=lst[k-1::-1]y=lst[:k-1:-1]returnlist(reversed(x+y))#测试用......
  • Python中的循环结构
    Python主要有for循环和while循环两种形式的循环结构,多个循环可以嵌套使用,并且还经常和选择结构嵌套使用。while循环一般用于循环次数难以提前确定的情况,当然也可以用于循环次数确定的情况;for循环一般用于循环次数可以提前确定的情况,尤其适用于枚举或遍历序列或迭代对象中元素的场合......
  • 使用Python批量随机化文件名
    本文的代码可以把指定文件夹中的所有文件名批量随机化。fromstringimportascii_lettersfromosimportlistdir,renamefromos.pathimportsplitext,joinfromrandomimportchoice,randintdefrandomFilename(directory):forfninlistdir(directory):#......
  • Python enumerate()函数的用法
    1.描述enumerate()函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在for循环当中。 2.语法enumerate(sequence,[start=0]) 3.参数sequence: 一个序列、迭代器或其他支持迭代对象。start: 下标起始位......
  • Python响应Ctrl键+鼠标滚轮操作动态调整文本框的字号
    编写程序,使用tkinter设计程序界面,其中放置带滚动条的文本框组件ScrolledText,当鼠标悬于该组件上方时,可以通过Ctrl键和鼠标滚轮来动态调整文本框中文本的字号,鼠标滚轮向上滚动时增大字号,向下滚动时减小字号。参考代码:......
  • Python使用tkinter组件Label显示简单数学公式
    任务描述:使用Python+tkinter编写GUI程序界面,使用Label组件显示简单数学公式。参考代码:运行效果:......
  • 使用Python扩展库spleeter分离MP3音乐文件中的伴奏和人声
    spleeter是由法国的音乐流媒体公司Deezer开源的项目,可以把音乐文件其分成2、4、5等多个独立的音轨,支持mp3、wav、ogg等常见音频格式。Spleeter基于TensorFlow开发,依赖sniffio、six、oauthlib、rfc3986、requests-oauthlib、numpy、llvmlite、h11、anyio、wheel、tensorbo......
  • Python三种方法统计4位自然数变为黑洞数6174所需次数分布
    对于各位数字互不相同的4位自然数,其各位数字能够组成的最大数减去能够组成的最小数,对得到的差进行同样的操作,7次之内必然得到6174。详见:使用Python验证6174猜想编写程序,统计各位数字互不相同的所有4位自然数变为6174所需要的操作次数,分别统计所需次数一样的数字个数,最后绘制柱状图......