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. 去空白+\t+\n + 指定字符串

    v1 = "alex "
    print(v1.strip())
    
    v2 = "alex\t"
    print(v2.strip())
    
    v3 = "alex\n"
    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")
      v1 = list("asdfadfasfdadfasfd")
      print(v1)
   

- ​   list( (11,22,33,44,) )

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

```

  • tuple('adfadfasdfasdfasdfafd')

    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))





猜你喜欢

转载自www.cnblogs.com/flamechan1981/p/12349722.html