python中的深copy和浅copy

bytes

Python bytes/str
bytes 在Python3中作为一种单独的数据类型,不能拼接,不能拼接,不能拼接

>>> '€20'.encode('utf-8')
b'\xe2\x82\xac20'
>>> b'\xe2\x82\xac20'.decode('utf-8')
'€20'

解码

>>> b'\xa420'.decode('windows-1255')
'?20'

深copy和浅copy
深copy新建一个对象重新分配内存地址,复制对象内容。浅copy不重新分配内存地址,内容指向之前的内存地址。浅copy如果对象中有引用其他的对象,如果对这个子对象进行修改,子对象的内容就会发生更改。

import copy

#这里有子对象
numbers=['1','2','3',['4','5']]
#浅copy
num1=copy.copy(numbers)
#深copy
num2=copy.deepcopy(numbers)

#直接对对象内容进行修改
num1.append('6')

#这里可以看到内容地址发生了偏移,增加了偏移‘6’的地址
print('numbers:',numbers)
print('numbers memory address:',id(numbers))
print('numbers[3] memory address',id(numbers[3]))
print('num1:',num1)
print('num1 memory address:',id(num1))
print('num1[3] memory address',id(num1[3]))

num1[3].append('6')

print('numbers:',numbers)
print('num1:',num1)
print('num2',num2)

输出:
numbers: ['1', '2', '3', ['4', '5']]
numbers memory address: 1556526434888
numbers memory address 1556526434952
num1: ['1', '2', '3', ['4', '5'], '6']
num1 memory address: 1556526454728
num1[3] memory address 1556526434952
numbers: ['1', '2', '3', ['4', '5', '6']]
num1: ['1', '2', '3', ['4', '5', '6'], '6']
num2 ['1', '2', '3', ['4', '5']]
时间: 2024-08-29 01:33:00

python中的深copy和浅copy的相关文章

(五)聊一聊深Copy与浅Copy

一.关于浅copy与深copy 首先说明一下: 在python中,赋值其实就是对象的引用,变量就是对象的一个标签,如果把内存对象比喻成一个个房间,那么变量就是门牌号. 深copy与浅copy只是针对可变类型而言,对于不可变类型,无论深浅,值相等,内存地址一样,一旦值发生变化,相当于再创建一个对象. 浅copy有3种方法: a=[1,2,3,["a","b"],22] a1=a[:]  切片操作 a2=list(a)  工厂函数 a3=copy.copy(a)  或

C#中的深复制和浅复制

最近在学习工作的生活中,在写代码过程中有这样一个需求,需要对一个对象进行复制,在改变复制后的对象的数据的时候不要改变原本的值的数据,于是便上网搜索相关的资料解决了问题. 众所周知,值类型(Value Type)(如 char.int 和 float).枚举类型和结构类型. 引用类型(Reference Type) 包含类 (Class) 类型.接口类型.委托类型和数组类型. 他们的区别在于: 1,值类型的变量直接包含其数据, 2,引用类型的变量则存储对象引用. 对于引用类型,两个变量可能引用同一

python深copy与浅copy的区别

首先先看一段代码 import copy a = [1, 2, 3, [4]] b = a c = a.copy() d = copy.deepcopy(a) e = copy.copy(a) a.append(4) a[3].append(5) print('a值为 {} 地址为 {}'.format(a, id(a))) print('b值为 {} 地址为 {}'.format(b, id(b))) print('c值为 {} 地址为 {}'.format(c, id(c))) print(

深copy及浅copy的对比

转自 http://python.jobbole.com/82294/ Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 下面本文就通过简单的例子介绍一下这些概念之间的差别. 对象赋值 直接看一段代码: Python 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 will = ["Will", 28, ["Python", "C#", "Ja

深浅copy,何为深浅copy,深copy和浅copy两者有何不同

copy,拷贝,顾名思义,自然是把东西复制过来,呈现在眼前的是一样的,例如: a = [1,2,3,4,5] b = a b.append(6) print(a,b) 输出: [1, 2, 3, 4, 5, 6] [1, 2, 3, 4, 5, 6] 很明显,a和b的值是一样的.因为对于赋值运算来讲,a与b指向的是同一内存地址,所以他们完全是一样的 浅copy: a = [1,2,3,4,[5]] b = copy.copy(a) b[4].append(6) print(a) print(b)

列表的使用2,深COPY和浅COPY,循环列表,步长切片

name2=names.copy() 下面我看几种奇怪的现象: 首先把源列表copy以后,把源列表第2个数值修改.那么没毛病. 如果源列表里,还包含了一个子列表:这也没毛病 如果我们这个时候修改子列表的数值.我们来看一个神奇的现象: copy是一种浅COPY,它只会COPY第一层的数据,而不会深入COPY.只会COPY子列表的内存指针,内存地址. 如果你不用COPY的方法,那问题会更严重: 结果是这样的,连浅COPY都不如:相当于只把列表的内存地址复制了一下: 简单来说就是这种情况. 但是如果是

关于iOS的深copy和浅copy 以及copy 和 strong 的区别

之前都是靠记忆来维持copy和strong  也有问过我 .  我自己说起来才感觉都说不很清楚 通过简单都代码来验证一下 . 有时候花点时间验证一下才能让思路更加清晰 NSMutableString * mustr = [NSMutableString stringWithString:@"good"]; self.str = mustr; self.fuzhiString = mustr; NSLog(@"self.str is (%@) ==== str,self.fuz

iOS中的深复制与浅复制

很多语言中都有深复制浅复制的概念,如C++,ObjC等.简单来说,浅复制就是两个变量指向了同一块内存区域,深复制就是两个变量指向了不同的内存区域,但是两个内存区域里面的内容是一样的. 浅复制示意图: 深复制示意图: iOS开发中,浅复制和深复制要更复杂一些,涉及到集合对象和非集合对象的copy与mutableCopy. 非集合对象:如NSString,NSInteger,NSNumber…… 集合对象:如NSArray,NSDictionary,…… 1:非集合对象的copy与mutableCo

Java中的深复制和浅赋值

深复制和浅复制也称为深拷贝和浅拷贝.简单的说就是创建一个和当前对象一模一样的对象.在日常编码的过程中使用的几率并不多,但在面试中却会被经常问到. 了解深复制和浅复制的原理后,可以帮助我们对Java中的值传递和引用传递有更深刻的理解. 浅复制 下面的实例中,我们创建一个原始类Monster,调用对象的clone方法复制一个新的对象. 注意:要调用对象的clone方法,需要让类实现Cloneable接口,并重写clone方法 public class Monster implements Clone