python3下关于copy和deepcopy中的区别

很多人在学习python3的时候,在字典部分copy和deepcopy感到很困惑,现在针对这两个方法进行区分,即一种是浅复制(copy),一种是深度复制(deepcopy)。


开头先下个结论

  • 我们日常所说的复制(自己在电脑硬盘上的复制)就是深复制(deepcopy),即将被复制对象完全再复制一遍作为独立的新个体单独存在。所以改变原有被复制对象不会对已经复制出来的新对象产生影响。
  • 而浅复制(copy)并不会产生一个独立的对象单独存在,他只是将原有的数据块打上一个新标签,所以当其中一个标签指向的数据块就会发生变化,另一个标签也会随之改变。这就和我们寻常意义上的复制有所不同了。

字典数据类型的copy函数,当简单的值替换的时候,原始字典和复制过来的字典之间互不影响,但是当添加,删除等修改操作的时候,两者之间会相互影响

废话不多,上代码示例吧:


代码如下:

from copy import deepcopy

d = {}

d["names"] = ["Alfred","Bertrand"]

b = d.copy()

b["names"] = "bob"

# 字典数据类型的copy函数,当简单的值替换的时候,原始字典和复制过来的字典之间互不影响

print("#字典数据类型的copy函数,当简单的值替换的时候,原始字典和复制过来的字典之间互不影响")

print(b)

print(d)

c = d.copy()

dc = deepcopy(d)

# 字典数据类型的copy函数,但是当添加,删除等修改操作的时候,两者之间会相互影响。

print("#字典数据类型的copy函数,但是当添加,删除等修改操作的时候,两者之间会相互影响。")

d["names"].append("Clive")

print(d)

print(c)

#deepcopy深度复制,在这里我理解的是完全复制然后变成一个新的对象,

# 复制的对象和被复制的对象没有任何关系,彼此之间无论怎么改变都相互不影响。

print("dc是深度copy(deepcopy):")

print(dc)


结果:

#字典数据类型的copy函数,当简单的值替换的时候,原始字典和复制过来的字典之间互不影响

{‘names‘: ‘bob‘}

{‘names‘: [‘Alfred‘, ‘Bertrand‘]}

#字典数据类型的copy函数,但是当添加,删除等修改操作的时候,两者之间会相互影响。

{‘names‘: [‘Alfred‘, ‘Bertrand‘, ‘Clive‘]}

{‘names‘: [‘Alfred‘, ‘Bertrand‘, ‘Clive‘]}

dc是深度copy(deepcopy):

{‘names‘: [‘Alfred‘, ‘Bertrand‘]}

时间: 2024-10-11 00:17:48

python3下关于copy和deepcopy中的区别的相关文章

从python中copy与deepcopy的区别看python引用

讨论copy与deepcopy的区别这个问题要先搞清楚python中的引用.python的内存管理. python中的一切事物皆为对象,并且规定参数的传递都是对象的引用.可能这样说听起来比较难懂,对比一下PHP中的赋值和引用就有大致的概念了.参考下面一段引用: 1. python不允许程序员选择采用传值还是传引用.Python参数传递采用的肯定是“传对象引用”的方式.实际上,这种方式相当于传值和传引用的一种综合.如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值——相当

论python3下“多态”与“继承”中坑

1.背景: 近日切换到python3后,发现python3在多态处理上,有一些比较有意思的情况,特别记载,供大家参考... 以廖老师的python3教程中的animal 和dog的继承一节的代码做例子,上代码先: #!/usr/bin/env python3 # -*- coding: utf-8 -*- class Animal(object): def run1(self): print('Animal is running 1...') def run2(self): self.run1(

python3下安装aiohttp遇到过的那些坑

python3下安装aiohttp遇到过的那些坑 最近需要用到aiohttp这个库,在安装过程中遇到很多坑.google.baidu后,依然没有找到合适的解决方案. 后来通过去python官方的PyPI查看aiohttp库,才发现一些问题,几经折腾,最后终于成功的在python3下安装’aiohttp’. 在这里跟大家分享一下被坑的过程. 先说一下环境.win7,64位.电脑里安装的python有3.5和3.6两个版本. 1. python3.6下安装aiohttp python3.6环境下,已

Neural networks学习——记录python3下与教材里的python2的不同

在经历了投了多次简历都石沉大海之后,决定继续充电充实自己OTL,于是开始学习神经网络这一块. 找到了深度学习的经典教材.在线网址:http://neuralnetworksanddeeplearning.com 但是这里用的是python2.7,而我自己学的是python3,所以部分代码不能直接搬用,先放上python3和python2有哪些不同. 然后再记录下在学习的过程中,需要改变的内容: 章节一(手写数字的辨认): 1.pickle的改变 这里需要把MNIST里的src文件夹下的mnist

在python3下使用peewee

在python3下使用peewee-2.1.4做ORM.连接MySQL数据库,提示需要MySQLdb模块,发现MySQLdb模块不支持python3,各种折腾.google不得其法. 然后又试着使用MySQL官方forPython驱动 Connector/Python需要对qeewee代码改动改动的渐入佳境,沾沾自喜中发现peewee的代码中有如下片段 try:import MySQLdb as mysqlexcept ImportError:try:import pymysql as mysq

Python3下map函数的问题

今天在群里有人问题,他的Python程序在家里运行好好的,但在公司一运行,就出问题了,查来查去查不出来,于是我就把他的程序调转过来看了一下,发现又是Python2.7与Python3的问题.代码是做了一个可定义任意位数的水仙花数函数 def fn(n):     rs = []     for i in range(pow(10,n-1),pow(10,n)):         rs = map(int, str(i))         sum = 0         for k in rang

python3下django连接mysql数据库

1.安装pymysql pip install pymysql 有一点需要注意,有的系统(比如ubuntu16.04)同时安装了python2和python3,而比较新的django需要在python3下运行,所以在安装pymysql时可能要使用命令 pip3 install pymysql 进行安装. 2.修改项目settings.py 找到并修改DATABASES为如下形式: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.m

windows系统下,在C#程序中自动安装字体

在Windows系统中,原有自带的字体样式有限,有时候我们的程序会使用到个别稀有或系统不自带的字体.因此我们需要将字体打包到程序中,当程序启动时,检测系统是否有该字体,如果没有则安装该字体,也可以动态加载字体. 1.1.使用代码安装字体 注意:安装字体时,需要windows的管理员权限. [DllImport("kernel32.dll", SetLastError = true)] public static extern int WriteProfileString(string

在Win7下利用VirtualBox和Vagrant中安装Docker

1.安装VirtualBox 和 Vagrant 首先下载安装VirtualBox 和 Vagrant的windows版本,两个都安装完成后,假设Vagrant在D:\HashiCorp\Vagrant目录下. 1.1 下载 cmd进入DOS,进入目录D:\HashiCorp\Vagrant\bin,一般标准命令是: To use the available boxes just replace {title} and {url} with the information in the tabl