编码,深浅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. webStorm和Sublime使用列编辑命令

    webStorm可以像Sublime一样使用列编辑,只是区别在于webStorm只可以编辑连续列表. 按住alt键鼠标选择一列,然后输入文字就会编辑多行,这个功能很赞,比较实用(按住ALT键选中之后, ...

  2. 进程与进程描写叙述符(task_struct)

    一. 进程 进程(Process) 计算机中的程序关于某数据集合上的一次执行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体: ...

  3. 学习vi和vim编辑器(5):越过基础的藩篱

    本章将对之前学习的编辑命令如" c "." d "." y "等命令进行总结,并学习一些新的知识:其它进入vi的方法,利用缓冲区来存储拖曳或 ...

  4. C++ 虚指针、成员变量与类对象的偏移地址

    先给出一段代码实现 #include <iostream> using namespace std; class animal { protected: int age; public: ...

  5. Ansible@一个高效的配置管理工具--Ansible configure management--翻译(一)

    未经书面许可,请勿转载 ---      Ansible is the simplest way to automate apps and IT infrastructure 这是Ansible官方站 ...

  6. Janus 二元神漏洞测试

    同步发表于:http://blog.hacktons.cn/2017/12/25/janus-demo/ 背景 12月9号,Andorid对外曝光了一个名为Janus的重量级系统漏洞CVE-2017- ...

  7. lodash源码分析之Hash缓存

    在那小小的梦的暖阁,我为你收藏起整个季节的烟雨. --洛夫<灵河> 本文为读 lodash 源码的第四篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash gitbo ...

  8. NOI2001 炮兵阵地

    一道非常有意思的题目 很久之前考过 但那时候好像只会打裸搜索(捂脸跑 后来看题解的时候也是没有学状压的所以算是闲置了很久没动的题 昨天看到的时候第一反应是m<=10所以压m然后跑1-n枚举每一行 ...

  9. alias 命令详解

    alias 命令 作用:  设置命令别名,可以将较长的命令进行简化,使用alias 时,用户必须使用单引号将原来的命令引起来,防止特殊字符导致错误. 如要永久生效则将alias 命令存放到bash 的 ...

  10. HTML基本功之文档结构

    项目名 首页 命名为 index.html 样式文件夹 命名为 css  /*用来放样式文件*/ base.css  /*基本样式*/ index.css /*首页样式*/ global.css /* ...