编码与深浅copy
一 编码操作
1 编码 enconde()
英文字符编码为"utf-8"时,一个字符占一个字节。
s1='abcdef'
b1=s1.encode('utf-8')
print(b1)
结果为:b'abcdef'
汉字编码为"utf-8"时,一个汉字占三个字节。
汉字编码为"gbk"时,一个汉字占两个字节。
s2='中国'
b2=s2.encode('utf-8')
b3=s2.encode('gbk')
print(b2)
print(b3)
结果为: b'\xe4\xb8\xad\xe5\x9b\xbd' b'\xd6\xd0\xb9\xfa'
2 解码 deconde()
s4="你好"
b4=s4.encode('utf-8')
b5=b4.decode('utf-8')
print("'你好'编码为'utf-8'后为:",b4)
print("解码后为:",b5)
b6=s4.encode('gbk')
b7=b6.decode('gbk')
print("'你好'编码为'gbk'后为:",b6)
print("解码后为:",b7)
结果为: '你好'编码为'utf-8'后为: b'\xe4\xbd\xa0\xe5\xa5\xbd' 解码后为: 你好 '你好'编码为'gbk'后为: b'\xc4\xe3\xba\xc3' 解码后为: 你好
二 深浅copy
定义:
在Python中对象的赋值其实就是对象的引用。当创建一个对象,把它赋值给另一个变量的时候,python并没有拷贝这个对象,只是拷贝了这个对象的引用而已。
浅拷贝:拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。也就是,把对象复制一遍,但是该对象中引用的其他对象我不复制
深拷贝:外围和内部元素都进行了拷贝对象本身,而不是引用。也就是,把对象复制一遍,并且该对象中引用的其他对象我也复制。
1 浅copy
(1)浅copy 第一层各自独立,从第二层开始,共用一个内存地址。
s1=[1,2,3] s2=s1 print(s1,s2) s1.append(666) print(s1) print(s2) print(id(s1)) print(id(s2))
结果为:
[1, 2, 3] [1, 2, 3] [1, 2, 3, 666] [1, 2, 3, 666] 2670563612488 2670563612488
可以看到s1、s2的内存地址是一样的,既就是s2为s1的一个引用而已。
(2)
s3=[1,2,3,[44,55]] s4=s3.copy() s3[-1].append(666) print(s3) print(s4) print(id(s3[-1])) print(id(s4[-1]))
结果为:
[1, 2, 3, [44, 55, 666]] [1, 2, 3, [44, 55, 666]] 1781567379272 1781567379272
2深copy
import copy s5=[1,2,3,[44,55]] s6=copy.deepcopy(s5) s5.append(666) print(s5) print(s6) print(id(s5)) print(id(s6))
结果为:
[1, 2, 3, [44, 55], 666] [1, 2, 3, [44, 55]] 1774773104968 1774773106248
可以看到s5、s6的内存地址是不一样的。
对于深copy来说,两个是完全独立的,改变任意一个的元素(无论是多少层),另一个绝不会改变。
总结:
(1)深浅拷贝都是对源对象的复制,占用不同的内存空间。
(2)不可变类型的对象,对于深浅拷贝毫无影响,最终的地址值和值都是相等的。
(3)可变类型:
=浅拷贝: 值相等,地址相等
copy浅拷贝:值相等,地址不相等
deepcopy深拷贝:值相等,地址不相

浙公网安备 33010602011771号