zoukankan      html  css  js  c++  java
  • day07补充-数据类型总结及拷贝

    数据类型总结

    按照存一个值 OR 多个值来分

    • 字符串、整型、浮点型存一个值
    • 列表、元组、字典、集合存多个值

    按照有序 OR 无序来分

    • 字符串、列表、元组是有序数据
    • 字典、集合是无序数据

    按照可变 OR 不可变来分

    • 列表、字典、集合是可变数据类型
    • 整型、浮点型、字符串是不可变数据类型

    拷贝 && 浅拷贝 && 深拷贝&& .copy()

    如果 l2 是 l1的拷贝对象,l1发生改变改变,则l2也会发生改变: 因为l1与l2指向同一个内存地址id,l1是可变数据类型,值变化时id不改变,因此l2跟着改变

    l1 = ['a','b','c',['d','e','f']]
    l2 = l1
    l1.append('g')
    print(f"l1内存地址为{id(l1)},打印值为{l1}")
    print(f"l2内存地址为{id(l2)},打印值为{l2}")
    
    l1内存地址为2068776007112,打印值为['a', 'b', 'c', ['d', 'e', 'f'], 'g']
    l1内存地址为2068776007112,打印值为['a', 'b', 'c', ['d', 'e', 'f'], 'g']
    

    浅拷贝:如果l2是l1的浅拷贝对象,l1内部的不可变数据发生改变,则l2不变,如果l1内部的可变对象发生改变,l2也会跟着改变

    import copy
    l1 = ['a','b','c',['d','e','f']]		
    l2 = l1.copy()
    l1.append('g')        # 改变l1中的不可变数据类型,l2不会改变
    print(f"l1内存地址为{id(l1)},打印值为{l1}")
    print(f"l2内存地址为{id(l2)},打印值为{l2}")
    
    print('*'*80)
    import copy
    l1 = ['a','b','c',['d','e','f']]
    l2 = l1.copy()
    l1[3].append('g')        # 改变l1中的可变数据类型,l2也会跟着改变
    print(f"l1内存地址为{id(l1)},打印值为{l1}")
    print(f"l2内存地址为{id(l2)},打印值为{l2}")
    
    l1内存地址为2068778801352,打印值为['a', 'b', 'c', ['d', 'e', 'f'], 'g']
    l2内存地址为2068778814984,打印值为['a', 'b', 'c', ['d', 'e', 'f']]
    ********************************************************************************
    l1内存地址为2068778811720,打印值为['a', 'b', 'c', ['d', 'e', 'f', 'g']]
    l2内存地址为2068778802376,打印值为['a', 'b', 'c', ['d', 'e', 'f', 'g']]
    

    深拷贝:如果l2是l1的深拷贝对象,l1内部的不可变对象发生改变,则l2不变,如果l1内部的可变对象发生改变,l2也不会改变。即:l1的改变不会影响l2

    import copy
    l1 = ['a','b','c',['d','e','f']]
    l2 = copy.deepcopy(l1)
    l1.append('g')        # 改变l1中的不可变数据类型,l2不会改变
    print(f"l1内存地址为{id(l1)},打印值为{l1}")
    print(f"l2内存地址为{id(l2)},打印值为{l2}")
    
    print('*'*80)
    import copy
    l1 = ['a','b','c',['d','e','f']]
    l2 = copy.deepcopy(l1)
    l1[3].append('g')        # 改变l1中的可变数据类型,l2不会改变
    print(f"l1内存地址为{id(l1)},打印值为{l1}")
    print(f"l2内存地址为{id(l2)},打印值为{l2}")
    
    l1内存地址为2068778801992,打印值为['a', 'b', 'c', ['d', 'e', 'f'], 'g']
    l2内存地址为2068778811464,打印值为['a', 'b', 'c', ['d', 'e', 'f']]
    ********************************************************************************
    l1内存地址为2068778067016,打印值为['a', 'b', 'c', ['d', 'e', 'f', 'g']]
    l2内存地址为2068776735112,打印值为['a', 'b', 'c', ['d', 'e', 'f']]
    

    copy() 从结果上来看就是浅拷贝

    l1 = ['a','b','c',['d','e','f']]
    l2 = l1.copy()
    l1.append('g')        # 改变l1中的不可变数据类型,l2不会改变
    print(f"l1内存地址为{id(l1)},打印值为{l1}")
    print(f"l2内存地址为{id(l2)},打印值为{l2}")
    
    print('*'*80)
    l1 = ['a','b','c',['d','e','f']]
    l2 = l1.copy()
    l1[3].append('g')        # 改变l1中的可变数据类型,l2也会跟着改变
    print(f"l1内存地址为{id(l1)},打印值为{l1}")
    print(f"l2内存地址为{id(l2)},打印值为{l2}")
    



    猜年龄游戏

    附加一个猜年龄的小游戏,再接再厉....

    """
        功能:登录用户猜年龄
        作者:前辈眼中的小白
        日期: 2019/5/25
    """
    
    real_age = 23       # 给定正确的年龄
    login_count = 0     # 控制登录次数
    count = 0       # 控制猜游戏的次数
    get_prize = []      # 接收奖品
    
    # 奖品列表
    prize = {'0': 'buwawa',
             '1': 'bianxingjingang',
             '2': 'aoteman',
             '3': 'Python从入门到放弃'
             }
    
    # 定义用户字典
    login_info = {'nick': '123',
                   'jishuxiaobai': '123'
                   }
    
    # 判断登录的次数,最多三次机会
    while login_count < 3:
    
        # 与用户交互输入登录名和密码
        user = input("请输入登录名:").strip()
        pwd = input("请输入密码:").strip()
    
        if login_info.get(user) != pwd:
    
            login_count += 1
            print(f"用户名或密码错误,还有{3-login_count}次机会")
            continue
    
        login_count = 4
        print("登录成功,请开始你的冒险之旅")
    
        # 核心代码,开始猜游戏
        while count < 3:
    
            age_str = input("Please enter age:").strip()  # 与用户交互输入猜的年龄
    
            # 判断是否是数字
            if not age_str.isdigit():
                print("请输入数字!!!")
                continue
    
            age_int = int(age_str)
    
            # 核心思想,年龄判断是否猜对
            if age_int == real_age:
    
                print(f"恭喜,猜对了!!!您可以在以下奖品中选择两件奖品
    {prize}
    ")
                Y_or_n_prize = input('是否领奖(领奖输入"Y"或者"y"),否则按任意键放弃领奖退出游戏:').strip()
    
                # 放弃领奖
                if not (Y_or_n_prize == 'Y' or Y_or_n_prize == 'y'):
                    print("您已放弃领奖,退出游戏")
                    break
    
                # 领两件奖品
                for i in range(2):
    
                    print(f"请选择第{i+1}件奖品,输入对应的数字序号:", end='')
                    choice = input().strip()
    
                    # 判断输入奖品
                    if choice not in ['0', '1', '2', '3']:
    
                        print('看不懂提示吗?输错了')
                        continue
    
                    get_prize.append(prize[choice])
    
                print(f"请领取奖品{get_prize}")
                break
    
            elif age_int > real_age:
    
                print("猜大了")
    
            else:
                print("猜小了")
    
            count += 1
    
            # 猜错三次后,判断是否继续游戏
            if count == 3:
                game_again = input('是否继续玩游戏,继续请输入"Y"或者"y",退出游戏请输入"N"或者"n":').strip()
    
                if game_again == 'Y' or game_again == 'y':
    
                    count = 0
    
                elif game_again == 'N' or game_again == 'n':
                
                    print("你已退出游戏")
                    break
    
                else:
                    print("非法输入,请按照要求输入")
    
  • 相关阅读:
    弹性盒子
    bzoj4237 稻草人
    bzoj2654 tree
    bzoj4813 [Cqoi2017]小Q的棋盘
    bzoj1014 [JSOI2008]火星人
    bzoj3242 [Noi2013]快餐店
    bzoj4025 二分图
    bzoj3237 [Ahoi2013]连通图
    bzoj3244 [Noi2013]树的计数
    bzoj2431 [HAOI2009]逆序对数列
  • 原文地址:https://www.cnblogs.com/863652104kai/p/10921829.html
Copyright © 2011-2022 走看看