编码,深浅copy

encode,decode在python2中使用的一些迷糊,python3中更容易理解

要理解encode和decode,首先我们要明白编码,字符和二进制的相关概念,简单来说,计算机的产生和设计只能进行二进制的运算,聪明的先辈们发明了ASCii编码用不同的二进制来表示不同英文字符实现.后来由于各国计算机的普及和推广,由于语言的原因产生了:Unicode,GB2312,UTF-8等不同的字符编码集.

在python3中对字符数据是使用的str类型,二进制数据使用的是bytes.而我们要让计算机能够处理字符串就必须能将字符转换为二进制数据(我们在idle中编写的代码这个步骤由解释器处理了).有时候为了我们在编写代码时能灵活的处理数据,就需要字符和二进制数据的转换.就产生了encode和decode方法,两者的关系如下:

#str->bytes:encode编码
#bytes->str:decode解码
str_a = str('我是二进制') #编码,
bytes_uft8 = str_a.encode(encoding='utf-8') #字符串转换为utf-8的二进制
print(bytes_uft8,type(bytes_uft8)) bytes_gbk = str_a.encode(encoding='gbk') #字符串转换为gbk的二进制
print(bytes_gbk,type(bytes_gbk)) #解码
str_uft8 = bytes_uft8.decode(encoding='utf-8') #二进制转换为utf的字符串
print(str_uft8,type(str_uft8)) str_gbk = bytes_gbk.decode(encoding='gbk') #二进制转换为gbk的字符串
print(str_gbk,type(str_gbk)) #保存到文件中,utf-8.txt将编码换为GBK会乱码,是因为GBK不兼容utf8.
#但是utf-8兼容gbk,所以gbk.txt用utf-8不会乱码.
with open('gbk.txt','wb') as f,open('utf-8.txt','wb') as f1:
f.write(bytes_gbk)
f1.write(bytes_uft8)

编码是将字符串转换成二进制编码.

解码是将二进制编码转换为字符串.

python2中默认使用ASCII编码,python3使用Unicode

获取系统默认编码:

import sys
print(sys.getdefaultencoding())

简单来说就是Unicode是二进制字符编码,兼容GBK,UTF-8,所有字符编码要转换都需要通过Unicode来作为桥梁来相互转换.在python解释器使用的字符编码是Unicode.中国使用的操作系统默认编码是GBK.而我们常用程序又有可能使用的其它国家的编码.所以这之间就存在一个编码和解码的过程.

所以我们记住utf8的python字符可以转化为gbk,big5等编码转换,但是要吧gbk,big5等编码转换为utf8必须要知道字符原来使用的那种编码集.不知道原来的字符集就没有办法转化为utf8.

#打开test.txt切换编码为utf8,gbk,big5可以看到不同效果
a = '中國'
b_utf8 =a.encode(encoding='utf8')
b_big5 =a.encode(encoding='big5')
b_gbk = a.encode(encoding='gbk') with open('test.txt','wb') as f:
f.write(b_utf8)
f.write(b_big5)
f.write(b_gbk)

最后:

1, python3是支持直接使用UTF-8(因为UTF-8是Unicode的一个扩展集,能够自动转换),但是在不同语言系的操作系统中可能会乱码.所以知道为什么有时候编写程序的时候全是乱码b'\xxx\xxx'的数据了吧,这是字符文本在Unicode中的代码

2, 关于为什么输出的是\xxx的数据.这个又涉及到二进制和16进制的转换了,我猜想应该是Unicode是使用16进制来记录二进制.

深浅copy

浅copy的方式,浅copy也是一种面向对象的实现,初学者可以这样去理解浅copy只是复制了对象的内存地址,对于一些复杂的数据类型对象使用的内存地址进行.

当列表中包含一个子列表时,复制的也是这个子列表的内存地址.

#申明一个列表
human = ['name',['age',18]]
#使用几种浅copy方式复制数据
p1 = human[:] #切片的方式
p2 = list(human) #使用内置函数 import copy
p3 = copy.copy(human) #使用copy模块浅copy方法 p4 = human.copy() #使用列表的copy方法,其实也是引用的copy模块浅copy的方法

这时候我们假如human是同一个生日的同学类型.他们的name属性不一致,但是随着时间的变化,年龄都会增长,所以他们的age的变化都会一致

p1[0] = 'dongxie'
p2[0] = 'xidu'
p3[0] = 'nandi'
p4[0] = 'beigai'
print(p1,p2,p3,p4)
#这时候不管修改谁的年龄,大家年龄都会变
p1[1][1] = 23
print(p1,p2,p3,p4)

python基础(三)编码,深浅copy的更多相关文章

  1. python基础三(深浅拷贝)

    1.赋值操作 list_1 = [1,2,3,['barry','Jerry']] list_2 = list_1 list_1[0] = 111 print(list_1) # [111, 2, 3 ...

  2. 第三篇:python基础之编码问题

    python基础之编码问题   python基础之编码问题 本节内容 字符串编码问题由来 字符串编码解决方案 1.字符串编码问题由来 由于字符串编码是从ascii--->unicode---&g ...

  3. Python基础-字符编码与转码

    ***了解计算机的底层原理*** Python全栈开发之Python基础-字符编码与转码 需知: 1.在python2默认编码是ASCII, python3里默认是utf-8 2.unicode 分为 ...

  4. python基础之编码问题

    python基础之编码问题 本节内容 字符串编码问题由来 字符串编码解决方案 1.字符串编码问题由来 由于字符串编码是从ascii--->unicode--->utf-8(utf-16和u ...

  5. Python 基础 三 反射

    Python 基础 三 反射 今天我们先介绍一下反射这个概念,啥是反射?反射就是自己检测自己.在我们Python的面向对象中的反射是啥意思呢?就是通过字符串的形式操作对象相关的属性.python中的一 ...

  6. python基础之 编码进阶,文件操作和深浅copy

    1.编码的进阶 字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码.即先将其他编码的字符串解码(decode)成unicode,再从unic ...

  7. python之路(集合,深浅copy,基础数据补充)

    一.集合:类似列表,元组的存储数据容器,不同点是不可修改,不可重复.无序排列. 1.创建集合: (1).set1 = {'abby', 'eric'} result:{'eric', 'abby'} ...

  8. 进击的Python【第三章】:Python基础(三)

    Python基础(三) 本章内容 集合的概念与操作 文件的操作 函数的特点与用法 参数与局部变量 return返回值的概念 递归的基本含义 函数式编程介绍 高阶函数的概念 一.集合的概念与操作 集合( ...

  9. python列表中的深浅copy

    列表中的赋值和平常的赋值是不一样的,看下面的代码: In [1]: a = 1 In [2]: b = a In [3]: a Out[3]: 1 In [4]: b Out[4]: 1 In [5] ...

随机推荐

  1. tensorflow MNIST新手教程

    官方教程代码如下: import gzip import os import tempfile import numpy from six.moves import urllib from six.m ...

  2. JDK与JRE的关系

    JDK  =   JRE + Java语言 + 工具及工具API JRE  =    程序部署发布 + 用户界面工作集 + 集成库 + 其他基础库 + 语言和工具基础库 + Java虚拟机 简单讲:J ...

  3. RT5350的uvc驱动支持yuv格式摄像头成功

    请尊重别人的劳动成果 转载请务必注明出处 今天在rt5350的板子上,成功将仅仅支持yuv格式的usb camera摄像头执行了.採用的是mjpeg streamer ,须要libjpeg库支持yuv ...

  4. javaweb:推断当前请求是否为移动设备訪问

    这段时间都是在做pc端的业务.结果经理找到我说,可能要做移动端的应用,后台逻辑还是用我写的逻辑.可是须要修改一些,看看怎么处理. 因为移动端和pc端还是略微有些差别的,我认为最好是在一个地儿统一推断, ...

  5. JavaScript 实现命名空间(namespace)的最佳方案——兼容主流的定义类(class)的方法,兼容所有浏览器,支持用JSDuck生成文档

    作者: zyl910 一.缘由 在很多的面向对象编程语言中,我们可以使用命名空间(namespace)来组织代码,避免全局变量污染.命名冲突.遗憾的是,JavaScript中并不提供对命名空间的原生支 ...

  6. JAVA入门[21]-Jedis操作redis示例

    本节目标 通过JedisPool获取Jedis示例,并完成对redis 简单的Key-value读写操作. 完整代码结构如下: redis服务端 在本地运行redis-server.exe,然后在re ...

  7. 【SqlServer】【问题收集】阻止保存要求重新创建表的更改

    1   概述 阻止保存要求重新创建表的更改,场景是这样的:假设数据库中有一张员工表EmployeeInfo,如下所示: 其中有个字段EmployeeBirthday,在设计表时,其类型误设为VARCH ...

  8. Angular专题系列之一:初识Anjularjs

    Angular作为一个前端的主流框架,以其强大的特性正在被越来越多的程序员们所使用,那么,什么是anjular呢?angularjs是一个javascript framework,一个js的框架,可以 ...

  9. D01 Elon Mulsk The future we're building — and boring

    摘要:精选TED. 每个音频不超过2分钟,学英语和吸收伟大思想两不误 音频: https://n1audio.hjfile.cn/st/fb5ace6f-7b63-439d-954c-c4539c1f ...

  10. java基础数据类型包装类

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...