• python学习笔记-第三章节 数据类型


    
    

    第三章 数据类型

    3.1 整型(int)

    age = 18
       
    

    3.1.1 整型的长度

    py2中有:int/long

    int

    ​ 32位电脑:-2147483648~2147483647

    ​ 64位电脑:-9223372036854775808~9223372036854775807 超出范围后python自动将其转换成long(长整形)

    整型除法只能保留整数位。

    from __future__ import division
    
    v = 9 /2
    print(v)
    

    py3

    只有:int (int/long)
    整型除法只能保留所有。

    3.1.2 整除

    py2和py3中整除是不一样。

    3.2 布尔(bool)

    布尔值就是用于表示真假。True和False。

    只有两个值:True/False

    转换

    数字转布尔:0是False,其他都是True

    字符串转布尔:“”是False,其他都是True

    其他类型转换成布尔值:

    • str
    • ...

    对于:None / "" / 0 .... -> false

    3.3 字符串(str)

    字符串特有

    • .upper() / .lower()

    • .isdigit()

    • .strip() / .lstrip() / .rstrip()

    • .replace("被替换的字符/子序列","要替换为的内容")

    • .replace("被替换的字符/子序列","要替换为的内容", 1)

    • .split('根据什么东西进行分割') /

    • .split('根据什么东西进行分割', 1 ) /

    • rsplit

      字符串是写代码中最常见的,python内存中的字符串是按照:unicode 编码存储。对于字符串是不可变。

      字符串自己有很多方法,如:

      1. 大写: upper

        v = 'ALEX'
        v1 = v.upper()
        print(v1)
        v2 = v.isupper() # 判断是否全部是大写
        print(v2)
        
      2. 小写:lower

        v = 'alex'
        v1 = v.lower()
        print(v1)
        v2 = v.islower() # 判断是否全部是小写
        print(v2)
        
        
        ############ 了解即可
        v = 'ß'
        # 将字符串变小写(更牛逼)
        v1 = v.casefold()
        print(v1) # ss
        v2 = v.lower()
        print(v2)
        
      3. 判断是否是数字: isdecimal判断是否10进制数

        isdigit() 函数是作用于字符串的,用来判断字符串是否全部由数字组成。

        isnumeric() 方法检测字符串是否只由数字组成。这种方法是只针对unicode对象。

         v = '1'
         # v = '二'
         # v = '②'
         v1 = v.isdigit()  # '1'-> True; '二'-> False; '②' --> True
         v2 = v.isdecimal() # '1'-> True; '二'-> False; '②' --> False
         v3 = v.isnumeric() # '1'-> True; '二'-> True; '②' --> True
         print(v1,v2,v3)
         # 以后推荐用 isdecimal 判断是否是 10进制的数。
         
         # ############## 应用 ##############
         
         v = ['alex','eric','tony']
         
         for i in v:
             print(i)
         
         num = input('请输入序号:')
         if num.isdecimal():
             num = int(num)
          print(v[num])
         else:
          print('你输入的不是数字')
    
    1. 去空白+ + + 指定字符串

      v1 = "alex "
      print(v1.strip())
      
      v2 = "alex	"
      print(v2.strip())
      
      v3 = "alex
      "
      print(v3.strip())
      
      v1 = "alexa"
      print(v1.strip('al'))
      
      • 公共

      • len ,计算长度。 (字符串->计算字符串中的字符个数)

      • 索引取值(0作为开始)

      
          v = "oldboy"
          v1 = v[0]  # 0 1 2 3 ... 从前向后
          v2 = v[-1] # -1 -2 -3 ...从后向前
      
    • 切片(0作为开始)
         v = "oldboy"
            
          
            # v1 = v[2:4] #   2 =< 索引位置 <3
          
            # v2 = v[3:6]
          
            # v2 = v[3:-1]
          
            # v2 = v[3:]
          
            # v2 = v[:-1]
          
            # print(v2)
          
            # 示例: 取最后两个字符
          
            # data = input('请输入:')
          
            # 方式一
          
            # v = data[-2:]
          
            # print(v)
          
            # 方式二
          
            # total_len = len(data)
          
            # v = data[total_len-2:total_len]
          
            # print(v)
    
    • 步长
       
        
          name = 'alex'
        
        # val = name[0:-1:2]
        # val = name[1:-1:2]
        # val = name[1::2]
        # val = name[::2]
        # val = name[-1:0:-2]
        # print(val)
        # 笔试题:请将字符串反转。
        val = name[::-1]
        print(val)
      
      • ​ for 循环

         name = 'alex'
         for item in name:
         	print(item)
        

      练习题

       # 1. for循环打印 “alex” 的每个元素: for > while
      

       # 2. 请打印: 1 - 10
       """
        for i in range(1,11): # [1,2,3,4,5,6,7,8,9,10,11,12,14]  "12345678910"
            print(i)
       """
       
       # 3. 请打印: 1 2 3 4 5 6 8 9 10
       """
       for i in range(1,11):
           if i == 7:
               pass
           else:
               print(i)
    
    • 独有功能
    1. 替换 replace

      replace("被替换的字符/子序列","要替换为的内容") / .

    replace("被替换的字符/子序列","要替换为的内容", 1)

    1. 开头 / 结尾

      startswith / endswith

         name = 'alex'
         
         # 判断是否已al开头
         """
         # 方式一:
         flag = name.startswith('al')
         print(flag)
         """
         """
         # 方式二:
         val = name[0:2]
         if val == 'al':
             print('是以al开头')
         else:
             print('不是')
    
    1. 编码,把字符串转换成二进制
    2. format
      name = "我叫{0},年龄:
      {1}".format('老男孩',73)
      print(n)
      
    3. encode
      name = '李杰' # 解释器读取到内存后,按照unicode编码存储:8个字节。
      v1 = name.encode('utf-8')
      print(v1)
      v2 = name.encode('gbk')
      print(v2)
      
    4. join
      name = 'alex' # a_l_e_x
      result = "**".join(name) # 循环每个元素,并在元素和元素之间加入连接符。
      print(result)
      
    5. split

      split('根据什么东西进行分割') / .split('根据什么东西进行分割', 1 ) / rsplit

    6. 其他【可选】

    3.4 列表

    users = ["李邵奇","奇航",99]
    
    3.4.1公共功能
    • len
    users = ["李邵奇","奇航",99]
    val = len(users)
    print(val) # 3
    
    • 索引
    users = ["李邵奇","奇航",99]
    val = users[0]
    print(val)
    
    • 切片
      users = ["李邵奇","奇航",99]
      
      val = users[0:2]
      
    • 删除(数字/布尔/字符串除外)
      users = ["李邵奇","奇航",99]
      # 方式一
      users.pop(1)
      print(users)
      
      # 方式二:
      del users[1]
      print(users)
      
      
      注意:
      • 字符串本身不能修改或删除【不可变类型】
    • v1 = "alex"
    • 列表是可变类型。
    • 修改(字符串/数字/布尔除外)
      users = ["李邵奇","奇航",99]
      users[2] = 66
      
      users[0] = '李杰'
      users[0][1]
      
      • 步长
        users = ["李邵奇","奇航",99]
        
        val = users[0:2:2]
        
        • 练习题
           
          实现一个整数加法计算器(两个数相加):
          
          如:content = input("请输入内容:") 用户输入:5+9或5+ 9或5 + 9(含空白),然后进行分割转换最终进行整数的计算得到结果。
          
          
          
          
          # 思路一:
           
          content = input('请输入:') # [5+9]  或 [5 +9]  或者 [ 5 + 9 ]
          content = content.strip() # [5+9]  或 [5 +9]  或者 [5 + 9]
          v1 = int(content[0])
          v2 = int(content[-1])
          v3 = v1 + v2 
           
          
          # 思路二:
          
          content = input('请输入:') # [5+9]  或 [5 +9]  或者 [ 5 + 9 ]
          content_len = len(content)
          index = 0
          total = 0
          while True:
              char = content[index]
              if char.isdigit():
                  total += int(char)
              index += 1
              if index == content_len:
                  break
          print(total)
          
          
          # 思路三:
           
          content = input('请输入:') # [5+9]  或 [5 +9]  或者 [ 5 + 9 ]
          result = content.split('+')
          # print(result) # ['55 ', ' 99 ']
          v1 = int(result[0]) # "55"
          v2 = int(result[1]) # " 99 "
          v3 = v1 + v2
          print(v3)
          
          
    • for 循环
      users = ['李邵奇','利奇航','张三丰','李子森']
      for i in users:
          print(i)
       
      users = ['李邵奇','利奇航','张三丰','李子森']
      for i in users:
          # 第一次循环:i=“李邵奇”
          print(i)
          for ele in i:
              print(ele)
      
      
      # 练习题:请通过for循环和数字计数器实现:users = ['李邵奇','利奇航','张三丰','李子森']
       
          0 李邵奇
          1 利奇航
          2 张三丰
          3 李子森
       
      # 方式一
      users = ['李邵奇','利奇航','张三丰','李子森']
      count = 0
      for i in users:
          print(count,i)
          count += 1
       
      # 方式二
      users = ['李邵奇','利奇航','张三丰','李子森']
      users_len = len(users) # 4
      for index in range(0,users_len): # [0,1,2,3]
          print(index,users[index])
      
      
    3.4.2独有功能
    • append, 在列表的最后追加一个元素
      users = []
      users.append('alex')
      print(user)
      
    示例一:
    users = []
    while True:
        name = input('请输入姓名:')
        users.append(name)
        print(users)
    
    示例二:
    # 录入用户和密码
    users = []
    for i in range(0,3): 
        name = input('请输入用户名和密码:')
        users.append(name)
    print(users) # ['alex,123', 'oldboy,888', 'lishaoqi,123']
    
    # 用户和密码校验
    username = input('请输入要登陆用户名:')
    password = input('请输入要登陆密码:')
    for item in users:
        result = item.split(',') # ['alex','123']
        user = result[0]
        pwd = result[1]
        if user == username and pwd == password:
            print('登陆成功')
            break
            
    
      • insert
    
      list.insert(index, obj)
        
      #!/usr/bin/python
         
      aList = [123, 'xyz', 'zara', 'abc']
         
      aList.insert( 3, 2009)
         
      print ("Final List : ", aList)
    

    • remove
      name_list.remove('Byrant')
      print(name_list)
      
    • pop
      a=name_list.pop()
      print(a)
      
    • clear
      #list.clear()
      
        
      list1 = ['Google', 'Runoob', 'Taobao', 'Baidu']
      list1.clear()
      print ("列表清空后 : ", list1)
        
      
    • extend
      aList = [1,2,3]
      bList = ['www', 'pythontab.com']
      aList.extend(bList)
      print(aList)
      # 结果:
      [1, 2, 3, 'www', 'pythontab.com']
      
      • reverse,反转。
        v1 = [1,2,3111,32,13]
        print(v1)
        v1.reverse()
        print(v1)
        
      • sort
        v1 = [11,22,3111,32,13]
        print(v1)
        
        # v1.sort(reverse=False) # 从小到大(默认)
        # v1.sort(reverse=True) # 从大到小
        # print(v1)
        
      3.4.3总结:
      • 增:

        • append / insert
      • 删:

        • remove / pop / clear / del users[2]
      • 改:

        
        
        • users[3] = "新值"
      • 查:

        • 索引/切片
        • 列表嵌套
        users = ["alex",0,True,[11,22,33,"老男孩"],[1,['alex','oldboy'],2,3]]
        
        users[0]
        users[2]
        users[0][2]
        users[3] # [11,22,33,"老男孩"]
        users[3][-1] # "老男孩"
        users[3][-1][1] # '男'
        users[3] = 666
        

        3.5元组

        3.5.1 元组书写规范
        users = [11,22,33,"老男孩"] # 列表(可变)
        users = (11,22,33,"老男孩") # 元组(不可变)
        
    3.5.2 公共功能
    • 索引(排除:int/bool)
      users = (11,22,33,"老男孩")
      
      print(users[0])
      print(users[-1])
      
    • 切片(排除:int/bool)
      users = (11,22,33,"老男孩")
      print(users[0:2])
      
    • 步长(排除:int/bool)
      users = (11,22,33,"老男孩")
      print(users[0:2:2])
      
    • 删除(排除:tuple/str/int/bool)
    • 修改(排除:tuple/str/int/bool)
    • for循环(排除:int/bool)

      users = (11,22,33,"老男孩")
      for item in users:
      print(item)

    • len(排除:int/bool)
      users = (11,22,33,"老男孩")
      print(len(users))
      
    3.5.3 独有功能(无)
    3.5.4特殊:元组中的元素(儿子)不可被修改/删除。
    # 示例一:
    v1 = (11,22,33)
    v1[1] = 999 # 错误
    v1 = 999  # 正确
    
    # 示例二:可以嵌套
    v1 = (11,22,33,(44,55,66),(11,2,(99,88,),3))
    
    # 示例三:嵌套
    v2 = [11,22,33,(11,22,33)]
    v2[-1][1] = 99 # 错误
    v2[-1] = 123 # 正确
    
    # 示例四:嵌套
    v3 = (11,[1,2,3],22,33)
    v3[1] = 666 # 错误
    v3[1][2] = 123
    

    3.6.字典

    帮助用户去表示一个事物的信息(事物是有多个属性)。

    info = {"name":'刘伟达','age':18,'gender':'男','hobby':'同桌'} # 键值
    
    # 请输出:我今天点%s,他的年龄是%s,性别是%s,他喜欢他的%s;
    
    3.6.1基本格式
    data = {键:值,键:值,键:值,键:值,键:值,键:值,}
    
    # 练习题
    userinfo = {'usenrame':'alex','password':"oldboy"}
    
    user = input('请输入用户:')
    pwd = input('请输入密码:')
    
    if userinfo['username'] == user and userinfo['password'] == pwd:
        print('登陆成功')
    else:
        print('用户名或密码错误')
    

    3.6.2独有功能

    info = {"name":'刘伟达','age':18,'gender':'男','hobby':'同桌'}
    
      1. keys, 获取字典中所有的键。 ['name','age','gender','hobby']
      # for item in info.keys():
      #     print(item)
      
      • 2.values,获取字典中所有的值。 ['刘伟达','18','男','同桌']

        # for v1,v2 in info.items():
        #     print(v1,v2)
        
        • 3.items,获取字典中的所有键值对。

          # for v1,v2 in info.items():
          #     print(v1,v2)
          
          
          • 4.get

            info = {'k1':'v1','k2':'v2'}
            
            # v1 = info['k11111']
            # v2 = info.get('k1111') # None就是Python中的空
            # v3 = info.get('k1111',666)
            # print(v2)
            
            # None数据类型,改类型表示空(无任何功能,专门用于提供空值)
            
            • 5.pop

              info = {'k1':'v1','k2':'v2'}
              result = info.pop('k2')
              print(info,result)
              
              del info['k1']
              
              • update

                info = {'k1':'v1','k2':'v2'}
                
                # 不存在,则添加/存在,则更新
                info.update({'k3':'v3','k4':'v4','k2':666})
                print(info)
                

    3.6.3公共功能

    • len

      info = {"name":'刘伟达','age':18,'gender':'男','hobby':'同桌'}
      print(len(info))
      
      • 索引

        info = {"name":'刘伟达','age':18,'gender':'男','hobby':'同桌'}
        info['name']
        info['age']
        
    • 切片【无】

    • 步长【无】

    • for

      info = {"name":'刘伟达','age':18,'gender':'男','hobby':'同桌'}
      
      for item in info.keys():
          print(item)
      
      for item in info.values():
          print(item)
      
      for k,v in info.items():
          print(k,v)
      
      • 修改(存在就修改/不存在就增加)

        # 改值
        info = {"name":'刘伟达','age':18,'gender':'男','hobby':'同桌'}
        info['age'] = 19
        print(info)
        
        # 改键
        # 删除后再增加
        del info['hobby']
        info['xxxxx'] = 'x1'
        
        • 删除
        info = {"name":'刘伟达','age':18,'gender':'男','hobby':'同桌'}
        
        del info['name']
        print(info)
        
        

    3.7 集合 set

    3.7.1 集合的特点
    • 无序
    • 无重复
      v = {1,2,3,4,5,6,99,100}
      
      # 疑问:v = {}
      
      None
      int
          v1 = 123
          v1 = int() --> 0
      bool
          v2 = True/False
          v2 = bool() -> False
      str
          v3 = ""
          v3 = str()
      list
          v4 = []
          v4 = list()
      tuple
          v5 = ()
          v5 = tuple()
      dict
          v6 = {}
          v6 = dict()
      set
          v7 = set()
      
      
      3.7.2 集合独有功能
      • add
      s = {6,7,8,9}
      #增加
      s.add(1)
      print(s)
      
      • discard
      • update
      s1 = {1,4,5}
      s1.update({2,3})   #s1变
      print(s1)
    
    
    • 删除
      s = {6,7,8,9}
      s.pop()
      print(s)
    
    #删除指定元素
    s = {6,7,8,9}
    s.remove(7)
    print(s)
    
    • intersection
    s1 = {1,2,3}
    s2 = {2,3,4}
    #交集
    print('交集: ',s1.intersection(s2))
    print('交集: ',s1 & s2)
    
    • union
      s1 = {1,2,3}
      s2 = {2,3,4}
      #并集
      print('并集: ',s1.union(s2))
      print('并集: ',s1 | s2)
    
    • difference
      s1 = {1,2,3}
      s2 = {2,3,4}
      print('差集: ',s1.difference(s2))   #s1 - (s1&s2)
      print('差集: ',s2.difference(s1))   #s2 - (s1&s2)
    
    • symmetric_difference
    s1 = {1,2,3}
    s2 = {2,3,4}
    print('对等差分: ',s1.symmetric_difference(s2))
    print('对等差分: ',s2.symmetric_difference(s1))
    
    • 子集
    s1 = {1,2}
    s2 = {1,2,3}
    print(s1.issuperset(s2))
    print(s1.issubset(s2))
    
    
    • 判断两个集合是否相交
    s1 = {1,2}
    s2 = {1,2,3}
    print(s1.isdisjoint(s2))
    
    3.7.3公共功能
    • len
      v = {1,2,'李邵奇'}
      print(len(v))
      
      • for 循环

        v = {1,2,'李邵奇'}
        for item in v:
            print(item)
        
        • 索引【无】

        • 步长【无】

        • 切片【无】

        • 修改【无】

    3.8 内容补充

    3.8.1强制转换
    • int('字符串') 【重要】

    • int(布尔值)

    • bool

      • bool(整数) -> bool(1)/.. -> bool(0)

      • bool(字符串) -> bool('xx') --> bool("")

      • bool(列表) -> bool([]) --> bool([])

      • bool(元组) -> bool(()) --> bool(空元组)

        v1 = bool(0)
        v2 = bool("")
        v3 = bool([])
        v4 = bool(())
        print(v1,v2,v3,v4) # False
        
       str(999)  # "999"
    
        str(True) # "True"
    
        str(["唐开发",'李忠伟'])   #  "["唐开发",'李忠伟']"    v2 = "".join(["唐开发",'李忠伟'])
    
        - str(["唐开发",'李忠伟']) 
    
        -   list("asdfadfasfdadfasfd")
    
       ```py
             v1 = list("asdfadfasfdadfasfd")
             print(v1)
          
    
    - ​   list( (11,22,33,44,) )
    

    v1 = list( (11,22,33,44,) )
    print(v1)

    - tuple('adfadfasdfasdfasdfafd')
    
    ```py
    v1 = tuple('adfadfasdfasdfasdfafd')
    print(v1)
    

    tuple([11,22,33,44])

    v1 = tuple([11,22,33,44])
    print(v1)
    
    • 总结

    • 常见的类型转换

    
    
    # 字符串转数字
    
    # 数字转字符串
    
    # 列表转元组
    
    # 元组转列表
    
    # 其他转bool时,只有:0 “”  []  () 
    

    # 练习题
    nums = [11,22,33,44]
    for i in range(0,len(nums)):
        nums[i] = str(nums[i])
    resutl = '_'.join(nums)
    print(resutl)
    
    # 1. "".join([元素必须是字符串,元素必须是字符串,])
    
    3.8.2 判断一个字符串中是否有敏感字符?
    • str

        v = "Python全栈21期"
        
        if "全栈" in v:
            print('含敏感字符')
            	
      
      • list/tuple

        v = ['alex','oldboy','藏老四','利奇航']
        
        if "利奇航" in v:
            print('含敏感')
        
        
    • dict

          v = {'k1':'v1','k2':'v2','k3':'v3'}​
           # 默认按照键判断,即:判断x是否是字典的键。
           if 'x' in v:    
                pass ​
                # 请判断:k1 是否在其中?
            if 'k1' in v:    
                 pass
                 # 请判断:v2 是否在其中?
                 # 方式一:循环判断
             flag = '不存在'
             for v in v.values():   
             	if v == 'v2':        
             		flag = '存在'
             	print(flag)
             # 方式二:
             if 'v2' in list(v.values()): # 强制转换成列表 ['v1','v2','v3']    		pass
             # 请判断:k2:v2 是否在其中?
             value = v.get('k2')
             if value == 'v2':    
             	print('存在')
             else:    
             	print('不存在')​
      
    • ​ 练习题

      # 让用户输入任意字符串,然后判断此字符串是否包含指定的敏感字符。
      
      char_list = ['利奇航','堂有光','炸展会']
      content = input('请输入内容:') # 我叫利奇航  / 我是堂有光  / 我要炸展会
      
      success = True
      
      for v in char_list:
          if v in content:
              success = False
              break
      
      if success:
      	print(content)
      else:
          print('包含铭感字符')
          
      # 示例:
      # 1. 昨天课上最后一题
      # 2. 判断 ‘v2’ 是否在字典的value中 v = {'k1':'v1','k2':'v2','k3':'v3'} 【循环判断】
      # 3. 敏感字
      
      3.8.3 嵌套问题
      # 1. 列表/字典/集合 -> 不能放在集合中+不能作为字典的key(unhashable)
      
      # info = {1, 2, 3, 4, True, "国风", None, (1, 2, 3)}
      
      # print(info)
      
      # 2. hash -> 哈希是怎么回事?
      
      # 因为在内部会将值进行哈希算法并得到一个数值(对应内存地址),以后用于快速查找。
      
      # 3. 特殊情况
      
      # info = {0, 2, 3, 4, False, "国风", None, (1, 2, 3)}
      
      # print(info)
      
      # info = {
      
      #     1:'alex',
      
      #     True:'oldboy'
      
      # }
      
      # print(info)
      

      ```
      

    3.9 内存相关

    • 示例一

      v1 = [11,22,33]
      v2 = [11,22,33]
      
      v1 = 666
      v2 = 666
      
      v1 = "asdf"
      v2 = "asdf"
      
      # 按理 v1 和 v2 应该是不同的内存地址。特殊:
      1. 整型:  -5 ~ 256 
      2. 字符串:"alex",'asfasd asdf asdf d_asdf '       ----"f_*" * 3  - 重新开辟内存。
      
      • 示例二:

        v1 = [11,22,33,44]
        v1 = [11,22,33]
        
        • 示例三:

          v1 = [11,22,33]
          v2 = v1 
          
          # 练习1 (内部修改)
          v1 = [11,22,33]
          v2 = v1 
          v1.append(666)
          print(v2) # 含 666
          
          # 练习2:(赋值)
          v1 = [11,22,33]
          v2 = v1 
          v1 = [1,2,3,4]
          print(v2)
          
          # 练习3:(重新赋值)
          v1 = 'alex'
          v2 = v1
          v1 = 'oldboy'
          print(v2)
          
    • 示例四

      v = [1,2,3]
      values = [11,22,v]
      
      # 练习1:
       
      v.append(9)
      print(values) # [11,22,[1,2,3,9]]
      
      # 练习2:
      
      values[2].append(999)
      print(v) # [1, 2, 3, 999]
       
      # 练习3:
       
      v = 999
      print(values) # [11, 22, [1, 2, 3]]
       
      # 练习4:
      values[2] = 666
      print(v) # [1, 2, 3]
      
    • 示例五

      v1 = [1,2]
      v2 = [2,3]

      v3 = [11,22,v1,v2,v1]

    • 查看内存地址

      v1 = [1,2,3]
      v2 = v1
      v1.append(999)
      print(v1,v2)
      print(id(v1),id(v2))
         
      
      
      v1 = [1,2,3]
      v2 = v1
      print(id(v1),id(v2))
      v1 = 999
      print(id(v1),id(v2))
      
      
      
      - 问题: == 和 is有什么区别?
        - == 用于比较值是否相等。
        - is 用于比较内存地址是否相等
      

    3.9.1深浅拷贝

    # 可变
    - 浅拷贝:拷贝第一层
    - 深拷贝:拷贝所有数据
    
    # 应该每次都拷贝一份(但由于小数据池,未拷贝)
    v1 = 'alex'
    import copy
    v2 = copy.copy(v1)
    print(id(v1),id(v2))
    
    v3 = copy.deepcopy(v1)
    print(id(v1),id(v3))
    
    v1 = [1,2,3,4]
    import copy
    v2 = copy.copy(v1)
    print(id(v1),id(v2))
    
    v3 = copy.deepcopy(v1)
    print(id(v1),id(v3))
    
    
    # v1 = [1,2,3,4,[11,22,33]]
    # import copy
    # v2 = copy.copy(v1)
    # print(id(v1),id(v2))
    # print(id(v1[4]),id(v2[4]))
    
    # v2 = copy.deepcopy(v1)
    # print(id(v1),id(v2))
    # print(id(v1[4]),id(v2[4]))
    
    
    # ###################################################
    # 练习 1
    """
    import copy
    v1 = [1,2,3]
    v2 = copy.copy(v1)
    print(v1 == v2) # True
    print(v1 is v2) # False
    print(v1[0] is v2[0]) # True
    
    # 练习 2
    
    import copy
    v1 = [1,2,3]
    v2 = copy.deepcopy(v1)
    print(v1 == v2) # True
    print(v1 is v2) # False
    print(v1[0] is v2[0]) # True
    
    ### 练习3
    
    import copy
    v1 = [1,2,3,{'k1':123,'k2':456}]
    v2 = copy.deepcopy(v1)
    print(v1 == v2) # True
    print(v1 is v2) # False
    print(v1[0] is v2[0]) # True
    print(v1[3] == v2[3]) # True
    print(v1[3] is v2[3]) # False
    
    # ################ 总结 #########################
    # 浅拷贝:只拷贝第一层。
    # 深拷贝:拷贝嵌套层次中的所有可变类型。
    # ------ 特殊情况
    
    v1 = (1,2,3,4)
    
    import copy
    v2 = copy.copy(v1)
    print(id(v1),id(v2))
    v3 = copy.deepcopy(v1)
    print(id(v1),id(v3))
    
    
    
    v1 = (1,2,3,[1,2,3],4)
    import copy
    v2 = copy.copy(v1)
    print(id(v1),id(v2))
    v3 = copy.deepcopy(v1)
    print(id(v1),id(v3))
    
    
    
    # 不可变
    # v1 = 'asdf'
    # v1 = 123
    # import copy
    # v2 = copy.copy(v1)
    # print(id(v1),id(v2))
    # v3 = copy.deepcopy(v1)
    # print(id(v1),id(v3))
    
    # 可变 + 不可变
    
    v1 = [1,2,3,[11,2,33]]
    import copy
    v2 = copy.copy(v1)
    print(id(v1),id(v2))
    v3 = copy.deepcopy(v1)
    print(id(v1),id(v3))
    
    
    
    
    
    
    
  • 相关阅读:
    求全排列,调用C++函数
    ZOJ 3508 (the war)
    HDU 1285
    SDUT--枚举(删数问题)
    SDUT--进制转换
    位运算
    [NOI2015]软件包管理器
    列队[noip2017]
    [APIO2007]动物园
    [NOI2001]炮兵阵地
  • 原文地址:https://www.cnblogs.com/flamechan1981/p/12349722.html
Copyright © 2020-2023  润新知