zoukankan      html  css  js  c++  java
  • python笔记07

    今日内容

    • 深浅拷贝(面试)
    • 文件操作

    今日内容

    1. 深浅拷贝

      v1=[1,2,[34,67,9]]
      import copy
      浅拷贝:
      拷贝第一层
      v2=copy(v1)---将v1的地址copy,最外层壳拷贝一份,内层变量指向地址不变。
      id(v1[2]),id(v2[2])--相同
      id(v1),id(v2)---不相同,不拷贝内部变量地址

    深拷贝:

    v1=[1,2,[34,67,9]]
    import copy
    深拷贝:
    拷贝所有数据(可变)
    V3=deepcoyy(v1)---将v1中可变类型地址进行拷贝。适合嵌套的类型
    id(v1),id(v2)--不同
    id(v1[2],id(v2[2))--不同,内部变量地址也拷贝
    

    实例验证:

    import copy
    v1=[1,2,[34,67,9]]
    v2=copy.copy(v1)
    print(id(v1),id(v2))
    print(id(v1[2]),id(v2[2]))
    
    v3=copy.deepcopy(v1)
    print(id(v1),id(v3))
    print(id(v1[2]),id(v3[2]))
    输出:
    39290696 39291976
    39290504 39290504
    39290696 39291912
    39290504 39291848
    

    总结:

    • 深浅拷贝只针对可变类型。如果只有一层,深、浅拷贝拷贝相同。
    • 浅拷贝:只拷贝第一层。内部元素指向不变。
    • 深拷贝:拷贝嵌套层次中所有的可变类型。不可变类型指向不变,可变类型重新复制一份,可变类型内的元素指向还是指向原先的位置。(内部元素其实也拷贝,但是为数字,字符串常见元素,所以位置不变)

    特殊情况:

    v1=(1,2,3)
    
    import copy
    
    v2=copy.copy(v1)
    
    print(id(v1),id(v2))
    
    v3=copy.deepcopy(v1)
    
    print(id(v1),id(v3)
    
    元组不可变,所以深浅拷贝的id都不变。
    
    v1=(1,2,3,[3,4,5])
    
    import copy
    
    v2=copy.copy(v1)
    
    print(id(v1),id(v2))
    
    v3=copy.deepcopy(v1)
    
    print(id(v1),id(v3)
    
    • 深浅拷贝只针对可变类型。
    • 元组内有可变类型(不可变类型内部有可变类型),深拷贝时,需要重新再创建一份,所以深拷贝后id会变化。
    • 深拷贝v3变化,v2与v1相同。
    • 字符串,元组,数字---数据类型,不可类型。
    1. 文件操作

    内存中默认编码方式为unicode;文件操作包括:打开,操作,关闭。

    • 打开

      • r,只能读。 【**】
      • w,只能写,写之前清空。 【**】
      • a,只能追加。【*】
      • r+
        • 读:默认从0的光标开始读,也可以通过 seek 调整光标的为位置。
        • 写:从光标所在的位置开始写,也可以通过 seek 调整光标的位置。
      • w+
        • 读:默认光标永远在写入的最后或0,也可以通过 seek 调整光标的位置。
        • 写:先清空。
      • a+
        • 读:默认光标在最后,也可以通过 seek 调整光标的位置。然后再去读取。
        • 写:永远写到最后。
    • 操作

        • read()
        • read(n) # 光标所在位置,后读取n个字符。
        • readlines()
      • write
    • 关闭

    • 文件读取流程:
      file_object=open('log.txt',mode='r',encode='utf-8')
      content=file_object.read()
      print(content)
      file_object.close()

    • 写入流程:
      file_object=open('log.txt',mode='w',encode='utf-8') ##w只写,打开瞬间清除已经存在的数据,一般用于新建。
      file_object.write('zhangsan')
      file_object.close()

    • 操作类型:
      a:追加,在文件尾部追加。
      r:只读,文件不存在报错。
      w:只写,先清空,一般用于文件不存在新建。
      a:追加。文件不存在,新建。
      可读可写:r+

    写入:根据光标的位置,从当前光标位置开始写入操作(可能会覆盖其他文字)。

    file_object.seek(2)#调整光标的位置。
    file_object=open('log.txt',mode='r+',encode='utf-8') 
    file_object.write(你好)##有个光标。先写入,在开始0字节写入你好,覆盖前两个字。
    content=file_object.read()
    print(content)
    file_object.write(6666)
    file_object.close()
    

    w+:

    默认光标在最后。
    
    写入时候将文件清空,读取时候需要调整光标位置。
    
    如果先读取,再写入,光标已经在写入的后面,在读取的时候,无法读取光标前面的内容。
    
    需要将光标移动至前面,file_object.seek(0),才可以读取到内容。
    

    可读可写:a+

    默认光标在文件最后,读取内容需要将光标移动至最前面,file_object.seek(0)
    
    如果调整光标位置:file_object.seek(0),写入内容,还是写在现在内容后
    

    r+:

    data=file_objcet.read(n)###读从当前光标位置读取n个字符
    
    file_object.readlines()###按照行读取,按照列表存入。
    
    如果读取特别大的文件:
    

    按行读取:

    for line in file_object:
    print(line.strip()) ##去掉换行符号
    

    写操作:

    file_object=open('log.txt',mode='w',encode='utf-8')
    file_object.write('wxwlllxx
    ') ###第一次写入的时候,在最后添加换行符,再次写入的时候就不会清空,内容在换行符光标的后面进行第二次内容写入。
    file_object.write('ix;wxmslhs')
    ###这里写入的内容就包括第一次和第二次写入的内容,两部分。
    print(content)
    file_object.close()
    

    总结

    • 深浅拷贝
    • 文件操作
      • 打开
      • 读写
      • 关闭
    • 文件操作和数据类型的结合使用。
  • 相关阅读:
    Redis21:客户端与服务器端的通信与redis管道
    Redis20:keys、scan、bigkeys、查看key的存储方式
    Redis19:限流
    Redis18:分布式锁
    Redis17:cluster集群
    Redis16:两种redis集群解决方案:codis和cluster
    Android : 获取声卡信息的测试代码
    Android : 基于alsa库的音乐播放
    Android system :灯光系统_HAL_lights
    Android system :led_class驱动
  • 原文地址:https://www.cnblogs.com/cuiyongchao007/p/12256139.html
Copyright © 2011-2022 走看看