编码,深浅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. UPDATE/INSERT用法研究

    UPDATE和INSERT语法相信大家都很熟悉,UPDATE的基本语法结构是 : UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 INSERT的基本语法是: INSERT ...

  2. Java设计模式之职责链设计模式

    1.什么是-职责链设计模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求 ...

  3. 在websphere上部署集群应用程序-工作记录

    1) 创建web集群.client集群,添加集群托管节点,根据需求来,我的需求是两个应用部署到4个服务器上,属于1主3备模式 2) 创建webspere变量:选择你需要的集群作用域,新建资源   (作 ...

  4. Xcode6 UIWebView与JavaScript交互(issue fix)

    这篇文章中,有介绍UIWebView与JavaScript交互,在UIWebView截获JavaScript请求处理.从app的角度,这是JavaScript的Hook请求. 在Xcode6之前的Ap ...

  5. POJ 2533 Longest Ordered Subsequence(DP 最长上升子序列)

    Longest Ordered Subsequence Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 38980   Acc ...

  6. Swift入门(五)——数组(Array)

    集合 集合的定义 Swift中提供了两种数据结构用于存放数据的集合,各自是数组(Array)和字典(Dictionary). 他们的主要差别在于数组中的元素由下标确定.而字典中的数据的值由数据的键(K ...

  7. angularf封装echarts

    前言:angular中快速使用echarts 在html使用ehart很简单,你只需要引入文件和按照官方例子按照对应参数配置和数据填充就Ok了,那么在angular中怎么使用eharts(可以使用ec ...

  8. .net core控制台应用程序初识

    .net core控制台应用程序与之前.net版本有所不同,编译之后不会生成.exe启动程序,而是生成.dll文件 所以在使用的时候需要敲入命令来启动控制台应用程序,命令是: start  dotne ...

  9. 获取AJAX加载的内容

    1.有些网页内容使用AJAX加载,AJAX一般返回的是JSON,直接对AJAX地址进行post或get,就返回JSON数据了. 2.用抓包工具分析https://movie.douban.com/j/ ...

  10. CS:APP3e 深入理解计算机系统_3e C Programming Lab实验

    queue.h: /* * Code for basic C skills diagnostic. * Developed for courses 15-213/18-213/15-513 by R. ...