1.深浅拷贝

  • 拷贝模块

    import copy
    
  • 不可变类型(元组除外)拷贝后内存地址相同

    SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
  • 可变类型,拷贝后会新生成一个内存地址

  • 浅拷贝

    • 只拷贝整个数据类型的表面内存地址

      • 无数据类型嵌套
      #不可变类型
      v1 = 'sssdddw'
      v2 = copy.copy(v1)   #引用模块
      print(id(v1),id(v2))	#2032429695216 2032429695216
      
      #可变类型,再开辟一块新内存地址进行存储
      v1 = [11,2,3]
      v2 = copy.copy(v1)
      print(id(v1),id(v2))	#1782467694976 1782467643392
      
      • 有数据类型嵌套
      #第一层可变类型数据的内存地址被重新创建,里层的内存地址则没变
      v1 = [1,2,3,[1,2,3]]
      v2 = copy.copy(v1)
      print(id(v1),id(v2))	#2510241515712 2510241705472
      print(id(v1[3]),id(v2[3]))	#2510241567296 2510241567296
      
  • 深拷贝

    • 不管数据类型有几层都重新创建内存地址存储

      import copy
      v1 = [1,2,3,[1,2,3]]
      v2 = copy.deepcopy(v1)
      print(id(v1),id(v2))	#1391916533888 1391916723584
      print(id(v1[3]),id(v2[3]))	#1391916585408 1391916722944
      
  • 特殊性

    • 元组

      • 如果元组只有一层那么深浅拷贝内存地址都不变

        import copy
        v1 = (1,2,3)
        v2 = copy.copy(v1)
        print(id(v1),id(v2))	#1993940503296 1993940503296
        
        import copy
        v1 = (1,2,3)
        v2 = copy.deepcopy(v1)
        print(id(v1),id(v2))	#2576028699392 2576028699392
        
      • 如果元组中嵌套列表在深拷贝中则会重新开辟内存地址

        import copy
        v1 = (1,2,3,[11,22,33])
        v2 = copy.deepcopy(v1)
        print(id(v1),id(v2))
        
  • 示例

    #1
    import copy
    v1 = '123'
    v2 = copy.copy(v1)
    print(v1 == v2)	#True
    print(v1 is v2)	#True
    v3 = copy.deepcopy(v1)
    print(v1 == v3)	#True
    print(v1 is v3)	#True
    #2
    import copy
    v1 = [11,'222',222]
    v2 = copy.copy(v1)
    print(v1 == v2)	#True
    print(v1 is v2)	#False
    v3 = copy.deepcopy(v1)
    print(v1 == v3)	#True
    print(v1 is v3)	#False
    #3
    import copy
    v1 = [11,'222',222,[33,44,22]]
    v2 = copy.copy(v1)
    print(v1[3] == v2[3])	#True
    print(v1[3] is v2[3])	#True
    v3 = copy.deepcopy(v1)
    print(v1[3] == v3[3])	#True
    print(v1[3] is v3[3])	#False
    

2.文件操作

  • 打开文件

    file = open('22.txt',mode='r',encoding='utf-8')
    	   open(文件路径,打开方式,文件编码)
    
  • 读取和写入文件

    • r ,read,可读

      • 只能读不能写

        file = open('22.txt',mode='r',encoding='utf-8')
        data = file.read()
        print(data)	
        file.close()
        
    • w, write,可写

      • 打开文件的同时清空文件内容,再写入数据

      • 如果文件不存在则先创建再写入数据

      • 只能写字符串

        file = open('22222.txt',mode='w',encoding='utf-8')
        file.write('123')
        file.close()
        
    • a,append 追加

      • 追加数据到文件内部数据末尾

        file = open('22222.txt',mode='a',encoding='utf-8')
        file.write('123')
        file.close()
        
    • r+,可读可写

      • 可以通过seek调光标位置来指定写入和查看位置
      #文件先写在查看(清除原有内容)
      file = open('22222.txt',mode='r+',encoding='utf-8')
      file.write('123')
      data = file.read()
      print(data)	#123
      file.close()
      #指定位置写入(则会覆盖指定位置字符后面的数据)
      file = open('22222.txt',mode='r+',encoding='utf-8')
      file.seek(2)
      file.write('666')
      data = file.read()
      print(data)	#这样只能读取写入后光标存在位置之后的数据
      file.close()
      
      file = open('22222.txt',mode='r+',encoding='utf-8')
      file.seek(2)
      file.write('666')
      file.seek(0)
      data = file.read()
      print(data)	#这样可以读取全部数据
      file.close()
      #如果想从文件末尾去添加数据
      file = open('22222.txt',mode='a+',encoding='utf-8')
      date = file.read()
      file.write('好')
      file.seek(0)
      date = file.read()
      print(date)	#123456好
      file.close()
      
    • w+,可写可读

      • 打开文件的同时清空文件内容,再写入数据
      • 可以通过seek调光标位来读取
      file = open('22222.txt',mode='w+',encoding='utf-8')
      file.write('好')
      file.seek(0)
      date = file.read()
      print(date)
      file.close()
      
    • a+,追加读

      • 追加数据到文件内部数据末尾
      • 可以通过seek调光标位置来读取数据
      file = open('22222.txt',mode='a+',encoding='utf-8')
      file.write('好')
      file.seek(0)
      date = file.read()
      print(date)	#1dfdsfdf好
      file.close()
      
  • 关闭文件

    • 文件操作完毕,文件未关闭情况下文件内部数据会存到内存中,并未保存到硬盘
    file.close()
    
  • 练习

    #练习一、换行写入数据
    file = open('22222.txt',mode='w',encoding='utf-8')
    while True:
        read_input = input('请输入你要说的话(输入n结束):')
        if read_input.lower() == 'n':
            break
        file.write(read_input + '\n')
    file.close()
    
    file = open('22222.txt',mode='r',encoding='utf-8')
    date = file.read()
    print(date)
    file.close()
    
    #练习二、把下面列表的内容输入到文件中保存
    '''
    user = [
        {'name':'alex','pwd':'123'},
        {'name':'eric','pwd':'oldboy'}
    ]
    '''
    user = [
        {'name':'alex','pwd':'123'},
        {'name':'eric','pwd':'oldboy'}
    ]
    file = open('22222.txt',mode='w',encoding='utf-8')
    for i in user:
        line = "%s|%s\n"%(i['name'],i['pwd'])
        file.write(line)
    file.close()
    file = open('22222.txt',mode='r',encoding='utf-8')
    date = file.read()
    print(date)
    file.close()
    
    #练习三、把练习二产生的文件里面的数据,提取到列表中保存
    #解法一(适用于数据量少的情况下使用)
    file =open('22222.txt',mode='r',encoding='utf-8')
    date = file.read()
    date = date.strip()
    date = date.split('\n')
    print(date)
    file.close()
    #解法二
    v1 = []
    file =open('22222.txt',mode='r',encoding='utf-8')
    for line in file:
        line = line.strip()
        v1.append(line)
    print(v1)
    file.close()
    
    #练习四、编写代码实现账号密码存储及登入验证
    #创建密码保存到文件中
    file = open('账号密码.txt',mode='a',encoding='utf-8')
    while True:
        user = input('请输入用户名:')
        if user.lower() == 'n':
            break
        pwd = input('请输入密码:')
        file.write('%s|%s\n'%(user,pwd))
    file.close()
    
    #从文件中验证账号密码
    
    user_pwd = []
    file = open('账号密码.txt',mode='r',encoding='utf-8')
    for i in file:
        i = i.strip()
        user_pwd.append(i)
    file.close()
    state = 1
    user_1 = input('请输入登入用户名:')
    pwd_1 =input('请输入登入密码:')
    for item in user_pwd:
        item_1 = item.split('|')
        if user_1 == item_1[0] and pwd_1 == item_1[1]:
            break
        else:
            state = 0
            break
    if state:
        print('登入成功!!!')
    else:
        print('登入失败')
    
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄