精华内容
下载资源
问答
  • deepcopy函数
    千次阅读
    2018-05-27 14:18:40

    元素被误改

    v = [0, 1, 2, 3]
    m = 3 * [v]

    现在的m为:[[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]
    令v[0] = -1

    v[0] = -1

    这时m的结果变为:[[-1, 1, 2, 3], [-1, 1, 2, 3], [-1, 1, 2, 3]]

    用copy模块下的deepcopy函数,防止元素被误改

    from copy import deepcopy
    
    v = [0, 1, 2, 3]
    m = 3 * [deepcopy(v)]

    现在的m为:[[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]
    令v[0] = -1

    v[0] = -1

    这时m的结果没有变化:[[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]

    更多相关内容
  • copy方法和deepcopy函数 copy方法用于复制一个字典,该方法返回复制后的新字典。 dict = {'a':20,'b':'hello','c':[1,2,3,4,5]} #复制一个新的字典 newdict = dict.copy() copy方法复制的字典只是浅复制,也就是说...

    copy方法和deepcopy函数

    copy方法用于复制一个字典,该方法返回复制后的新字典。

    dict = {'a':20,'b':'hello','c':[1,2,3,4,5]}
    #复制一个新的字典
    newdict = dict.copy()
    

    copy方法复制的字典只是浅复制,也就是说值复制第1层的字典数据。至于第2层及以下的所有层,原字典和新字典都指向同一个值,也就是说,不管是修改原字典中的这些元素,还是修改新字典中的这些元素,原字典和新字典中对应的元素都会同时改变。对于上面的代码,如果修改字典dict中key等于’a’或’b’的值,字典newdict中对应的值并不会发生改变,因为’a’和’b’的值都属于第1层(只是一个简单的数值或字符串),而不管修改哪一个字典中key为’c’的值,另外一个字典对应的值也都会改变。这里修改key为’c’的值并不是指替换整个列表([1,2,3,4]),而是修改该列表中的某个值,如将’4’修改成’20’。

    如果要想改变这种情况,就需要使用copy模块中的deepcopy函数,该函数可以对序列进行更深层复制。

    #导入copy模块中的deepcopy函数
    from copy import deepcopy
    dict = {'a':20,'b':'hello','c':[1,2,3,4,5]}
    #newdict是经过深层复制的字典,与dict中的元素完全脱离,不会影响到另外一个字典的元素
    newdict = deepcopy(dict)
    

    [例 6.6] 本例演示了如何使用copy方法与deepcopy函数对字典进行浅层复制和深层复制,并将字典元素修改前后的结果输出到控制台,以便进行对比。

    #定义一个字典
    persons1 = {'Name':'小黑','age':27,'fullName':['小黑','小红']}
    
    #对persons1进行浅层复制
    persons2 = persons1.copy()
    
    #输出persons1
    print('persons1', persons1)
    #输出结果:persons1 {'Name': '小黑', 'age': 27, 'fullName': ['小黑', '小红']}
    
    #输出persons2
    print('persons2', persons2)
    #输出结果persons1 {'Name': '小黑', 'age': 27, 'fullName': ['小黑', '小红']}:
    
    print('------浅层复制------')
    print('------修改第1层元素------')
    
    #修改persons2中key为'age'的值
    persons2['age'] = 25
    print('persons1',persons1)
    #输出结果:persons1 {'Name': '小黑', 'age': 27, 'fullName': ['小黑', '小红']}
    
    print('persons2',persons2)
    #输出结果:persons1 {'Name': '小黑', 'age': 27, 'fullName': ['小黑', '小红']}
    
    print('------修改第2层元素------')
    #修改persons2的第2层数据(字符串列表中第2个元素)
    persons2['fullName'][1] = '小青'
    print('persons1',persons1)
    #输出结果:persons1 {'Name': '小黑', 'age': 27, 'fullName': ['小黑', '小青']}
    
    print('persons2',persons2)
    #输出结果:persons1 {'Name': '小黑', 'age': 27, 'fullName': ['小黑', '小青']}
    
    print('------深层复制------')
    from copy import deepcopy
    persons1 = {'Name': '小黑', 'age': 27, 'fullName': ['小黑', '小红']}
    # persons2为浅层复制的字典
    persons2 = persons1.copy()
    
    #persons3为深层复制的字典
    persons3 = deepcopy(persons1)
    
    #修改原字典的第2层元素
    persons1['fullName'][1] = '小青'
    print('persons1',persons1)
    #输出结果:persons1 {'Name': '小黑', 'age': 27, 'fullName': ['小黑', '小青']}
    
    print('persons2',persons2)
    #输出结果:persons1 {'Name': '小黑', 'age': 27, 'fullName': ['小黑', '小青']}
    
    print('persons3',persons3)
    #输出结果:persons3 {'Name': '小黑', 'age': 27, 'fullName': ['小黑', '小红']}
    

    输出结果:

    persons1 {'Name': '小黑', 'age': 27, 'fullName': ['小黑', '小红']}
    persons2 {'Name': '小黑', 'age': 27, 'fullName': ['小黑', '小红']}
    ------浅层复制------
    ------修改第1层元素------
    persons1 {'Name': '小黑', 'age': 27, 'fullName': ['小黑', '小红']}
    persons2 {'Name': '小黑', 'age': 25, 'fullName': ['小黑', '小红']}
    ------修改第2层元素------
    persons1 {'Name': '小黑', 'age': 27, 'fullName': ['小黑', '小青']}
    persons2 {'Name': '小黑', 'age': 25, 'fullName': ['小黑', '小青']}
    ------深层复制------
    persons1 {'Name': '小黑', 'age': 27, 'fullName': ['小黑', '小青']}
    persons2 {'Name': '小黑', 'age': 27, 'fullName': ['小黑', '小青']}
    persons3 {'Name': '小黑', 'age': 27, 'fullName': ['小黑', '小红']}
    

    从上面的代码可以看出,最后分别用copy方法和deepcopy函数将persons1浅层复制和深层复制一个字典:persons2和persons3。如果修改persons1的第2层元素,那么persons2中对应的元素也会随着改变,但persons3中对应的元素并未发生改变。这是因为persons2中key为’fullName’的元素值其实与persons1中key为’fullName’的元素值是同一个值,而persons3中key为’fullName’的元素值是与persons1中同样的值完全毫无关系,所以persons3中的该元素值并未发生任何改变。

    展开全文
  • >> > import copy >> > spam = ...deepcopy ...copy函数的存在即为了解决列表或者字典传递时,修改当前变量的值不影响原来列表或者字典的值。此时的spam和cheese指向了不同的列表 deepcopy同理
    >>> import copy
    >>> spam = [1, 2, 3]
    >>> cheese = copy.copy(spam)
    >>> cheese[1] = 42
    >>> cheese
    [1, 42, 3]
    >>> spam
    [1, 2, 3]
    
    >>> kat = copy.deepcopy(spam)
    >>> kat[2] = 400
    >>> kat
    [1, 2, 400]
    >>> spam
    [1, 2, 3]

    copy函数的存在即为了解决列表或者字典传递时,修改当前变量的值不影响原来列表或者字典的值。此时的spam和cheese指向了不同的列表
    deepcopy同理

    展开全文
  • #------------------------------------------------我是可耻的分割线-------------------------------------------在处理列表和字典时,尽管传递引用常常是最方便的方法,但如果函数修改了传入的列表或字典,你可能...

    随笔记录方便自己和同路人查阅。

    #------------------------------------------------我是可耻的分割线-------------------------------------------

    在处理列表和字典时,尽管传递引用常常是最方便的方法,但如果函数修改了传入的列表或字典,你可能不希望

    这些变动影响原来的列表或字典。要做到这一点,Python提供了名为copy的模块,其中包含copy()和deepcopy()函数。

    第一个函数copy.copy(),可以用来复制列表或字典这样的可变值,而不是只复制引用。

    两者的区别是copy.copy()是这复制了列表或字典的值,但是引用还是同一个。而copy.deepcopy()是产生一个新的

    引用使新的变量和被复制变量引用不同。看下面的示例代码:

    #------------------------------------------------我是可耻的分割线-------------------------------------------

    1、copy.copy(),示例代码:

    #

    # -*- coding:utf-8 -*-

    # Autor: Li Rong Yang

    import copy

    spam = ['A','B','C','D',[1,2,3,4]]

    cheese = copy.copy(spam)

    spam[0] = 42

    print(spam)

    运行结果:

    根据结果可以看出,使用copy.copy()函数时,cheese是复制了spam列表引用,对spam列表操作时,也会对cheese列表产生影响。这也被称为浅copy。

    2、deepcopy.copy(),示例代码:

    #

    # -*- coding:utf-8 -*-

    # Autor: Li Rong Yang

    import copy

    spam = ['A','B','C','D',[1,2,3,4]]

    cheese = copy.deepcopy(spam)#不同部分

    spam[0] = 42

    print(spam)

    运行结果:

    根据结果可以看出,使用deepcopy()时,对spam列表操作不会对cheese列表产生影响,这是因为deepcopy()是产生一个新的引用,这样spam和cheese

    是两个不同的引用所以在对spam列表操作时不会对cheese列表产生影响。

    展开全文
  • python中copy()和deepcopy()详解

    千次阅读 2021-03-17 15:29:15
    deepcopy概念图如下: deepcopy的时候会将复杂对象的每一层复制一个单独的个体出来。 这时候的 origin[2] 和 cop2[2] 虽然值都等于 [3, 4],但已经不是同一个 list了。即我们寻常意义上的复制。
  • 见图:
  • Python进阶之路 copy()和deepcopy()函数

    千次阅读 2019-06-11 21:25:58
    copy模块的copy()和deepcopy()函数 在处理列表和字典时,尽管传递引用常常是最方便的方法,但如果函数修改了传入的列表或字典,你可能不希望这些变动影响原来的列表或字典。要做到这一点,Python提供了名为copy的...
  • 背景开发工作中,有时候我们希望可以快速复制一个对象,python封装了内置函数copy模块中有copy与deepcopy函数,其中 copy是浅拷贝,deepcopy是深拷贝。在学习这俩个点时 我们需要弄清楚以下几点:为什么需要copy模块...
  • copy.deepcopy()函数深复制

    千次阅读 2021-03-27 10:00:37
    coopy.deepcopy()函数是一个深复制函数。 所谓深复制,就是从输入变量完全复刻一个相同的变量,无论怎么改变新变量,原有变量的值都不会受到影响。 与等号赋值不同,等号复制类似于贴标签,两者实质上是同一段内存。...
  • 仅出于教育目的,我尝试实现copy.deepcopy()的克隆函数。在在玩了一番代码并在谷歌上搜索之后,我想出了以下函数:def my_deepcopy(data):if isinstance(data, dict):result = {}for key, value in data.items():...
  • My goal is to have two functions with the same implementation but ...大多数用户都会这样做,假设原始函数位于old_module.py:def implementation(arg1, arg2):"""this is a killer function"""在new_module.p...
  • >>> import copy >>> origin = [1, 2, [3, 4]] ... cop2 = copy.deepcopy(origin) >>> cop1 == cop2 True >>> cop1 is cop2 False #cop1 和 cop2 看上去相同,但已不
  • js的深拷贝deepCopy

    千次阅读 2021-12-31 13:41:22
    js中Array类型和Object类型,如果用=直接赋值,改变其中一个,另一个也会发生改变,因为指向的是内存地址。 利用深拷贝,解决。 var model = deepCopy(this.queryModel);
  • 在使用列表或者字典进行传递参数的时候,可能会遇到函数改变了列表的值,但是不希望印象原来列表中的值,所以,python提供了copy模块,其中包含copy()和deepcopy()两函数,顾名思义copy()指的就是浅复制,...
  • js实现deepCopy

    2021-03-25 15:43:53
    } // 匹配函数 function metaType (obj) { const MAP = { '[object String]': 'string', '[object Number]': 'number', '[object Boolean]': 'boolean', '[object Null]': 'null', '[object Undefined]': '...
  • python函数 系列目录:python函数——目录 0. 前言 在python 中我们想备份一个list ,但是如果改变其中一个值,另外一个也会变,如下所示: >>> a = b = c = [4,5] >>> ...
  • copy.deepcopy()的用法是将某一个变量的值赋值给另一个变量(此时两个变量地址不同),因为地址不同,所以可以防止变量间相互干扰。大家可以猜猜下面代码第四行输出什么值例1.a = [1, 2, 3]d = a # a和d的地址相同, ...
  • 大家好,我是胡亥大魔王。今天介绍python中引用、copy() 及 deepcopy() 的使用
  • I have been playing with the deepcopy function and the copy function and I get the same issue with both of them. It is like the copy was a reference (or a pointer) instead of a proper copy. I am worki...
  • copy与deepcopypython 中的copy与deepcopy是内存数据的操作,但是两个函数有一定的区别。1.copyimport copylist = [1, [4, 5, 6], 2, 3]list1 = copy.copy(list)print id(list)print id(list[1])print id(list1)...
  • deepcopy() 是真正意义上的复制,即重新开辟一片空间,经常说的复制实际上就是 deepcopy,深层复制之后的对象不受原对象的影响,无论原对象发生什么修改,深层复制的对象都不会发生改变。 >>> import c
  • 借鉴了一位大佬的想法:...1、首先实现一个函数对变量类型进行判断 // 判断变量的类型 function getType(obj){ var str = Object.prototype.toString.call(obj); // typeof 不能准确判断一个对象变量, ...
  • 本例完整运行截图: 浅拷贝 如何使用深拷贝 如果想避免浅拷贝带来的麻烦,直接使用深拷贝,可以使用copy模块中的deepcopy()函数: from copy import deepcopy mylist = [] x = [1, 2, 3] mylist.append(deepcopy(x)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,867
精华内容 9,546
关键字:

deepcopy函数