• CSIC_716_20191107【深拷贝、文件的编码解码、文件的打开模式】


    深拷贝和浅拷贝

    列表的拷贝,用copy方法浅拷贝,新列表和被拷贝列表的id是不一样的

    list1 = [1, 'ss', (5, 6), ['p', 'w','M'], {'key1': 'value1', 'key2':'value2'}]
    print('list1', id(list1))  # list1 1964077175880
    list2 = list1.copy()
    print('list2', id(list2))  # list2 1964333005960
    

     

    浅拷贝之后,如果在新的列表中改变可变元素,会同步影响被拷贝列表中对应的元素,两者联动

           如果在新列表中改变不可变元素,新老列表不会同步变化

    list1 = [1, 'ss', (5, 6), ['p', 'w','M']]
    print('list1', id(list1))  # list1 2443199403080
    list2 = list1.copy()
    print('list2', id(list2))  # list2 2443455166280
    list2[3][1] = 'qqqqqq'  # 对list2中第四个元素进行修改
    list2[2] = ('x', 'y')
    print('list1第四个元素id', id(list1[3]))  # list1第四个元素id 2443199402568
    print('list1第一个元素id', id(list1[0]))  # list1第一个元素id 140729573994768
    print(list1)    # [1, 'ss', (5, 6), ['p', 'qqqqqq', 'M']]
    print('list2第四个元素id', id(list2[3]))  # list2第四个元素id 2443199402568
    print('list2第一个元素id', id(list2[0]))  # list2第一个元素id 140729573994768
    print(list2)  # [1, 'ss', ('x', 'y'), ['p', 'qqqqqq', 'M']]
    

      

    深拷贝需要import  copy的包,使用其中的deepcopy函数

    深拷贝之后,新旧列表毫无瓜葛,就是完全不相关的两个列表。

    深拷贝之后,列表中可变元素的id不一样,不可变元素的id是一样的。

    import copy
    list1 = [1, 'ss', (5, 6), ['p', 'w','M']]
    list2 = copy.deepcopy(list1)
    print('list1', id(list1))  # list1 1665335972936
    print('list2', id(list2))  # list2 1665620498440
    list2[3][1] = 'qqqqqq'
    print(list1)  # [1, 'ss', (5, 6), ['p', 'w', 'M']]
    print(list2)  # [1, 'ss', (5, 6), ['p', 'qqqqqq', 'M']]
    print('list1第四个元素id', id(list1[3]))  # list1第四个元素id 1665335972424
    print('list2第四个元素id', id(list2[3]))  # list2第四个元素id 1665365546952
    

      

    文件的编码

    在电脑中执行程序的过程

    1、硬盘的内容加载到内存

    2、CPU去内存中取数据,执行程序。

    3、执行生成的数据,优先存入内存。

    python解释器在计算机中的运行过程

    1、python解释器代码由硬盘加载到内存

    2、文件从硬盘加载到内存

    3、解释器读取文件内容

    4、识别python语法,执行操作

    ASCII码   一个字节代表一个英文字母

    GBK码  两个字节代表一个中文

    utf-8码  一个字节代表英文,3个字节代表汉字

    utf-8只和Unicode做映射,其他编码必须先转成unicode,才可以转成utf-8

    目前,计算机内存中均是Unicode,硬盘中均是utf-8

    字节byte,一个字节由8个bit组成。

    编码的过程,由字符转为字节流    encode

    解码的过程,由字节流转为字符    decode

    用什么格式编码,就要用什么格式解码

    unicode(内存)  ---> 编码encode---> utf-8(硬盘)

    utf-8(硬盘)--->  解码decode---> unicode (内存)

        

    打开文件的三种模式

    1、 r模式,

      只读,如果文件不存在的话会报错

    2、w模式

      只写,如果文件不存在,则创建一个文件,将内容写入

      如果文件存在,则会先将文件里的内容清空,再将内容写进去

    3、a模式

      如果文件存在,则再内容后面追加内容

      如果文件不存在,则创建一个文件,将内容写入

    打开文件的语法格式:

    with open(r带后缀的文件名’,mode=‘打开模式’,encoding='文件的编码格式')as  f  :

    r    :   用来转义‘带后缀的文件名’路径中的转义字符

    带后缀的文件名   :可以是绝对路径,也可以是相对路径

    文件编码格式  : 与打开的文件编码模式一致即可

    f  :文件对象的建成,便于后面使用

    举例说明:

    with open(r'RECORD.txt', 'w', encoding='utf-8') as wf:
        wf.write('AAAAAAA')  # AAAAAAA
    with open(r'RECORD.txt', 'a', encoding='utf-8')as af:
        af.write('BBBBB')  # AAAAAAABBBBB
    

     也可以同时打开两个文本文件,一个只读一个只写

    with open(r'RECORD.txt', 'r', encoding='utf-8') as rf,         #r默认的时rt,读文本文件的
            open(r'newRecord.py', 'w', encoding='utf-8')as wf:
        a = rf.read()  # 打开RECORD.txt文件
        wf.write(a)  # 将RECORD.txt文件写入newRecord.py
    

     打开图片等非文本文件,拷贝的时候不要指定encoding参数。

    with open(r'th.jpg', 'rb') as rf, open(r'newPhoto.png', 'wb')as wf:        #rb用于读byte文件的
        sss = rf.read()
        wf.write(sss)
    

      

  • 相关阅读:
    ubuntu系统安装微信小程序开发工具
    【工具】vscode-代码编辑器详解
    微信小程序开发
    webpack基本配置
    vue相关知识
    史上最强vue总结~万字长文---面试开发全靠它了
    ES6——字符串
    ES6——Proxy与Reflect
    ES6——Map与Set
    ES6——Symbol
  • 原文地址:https://www.cnblogs.com/csic716/p/11814281.html
Copyright © 2020-2023  润新知