Python知识——深浅copy、while循环

深浅copy

list1=['egon','lxx',[1,2]]
list2=list1
list1[0]='ni'
print(list2[0])

此时对list1的第一个元素的值进行改变时,list2的第一个元素也产生了改变,因为指向就是同一个地址
在这里插入图片描述

此时想让list2拷贝list1的内容,并独立出来

1、浅拷贝

list1=['egon','lxx',[1,2]]
list2=list1.copy()
list1[0]=2
print(list2[0])

在这里插入图片描述
发现输出的结果并没有随着list1的更改而更改,并且此时list2的地址已经与list1不同。
但是更改list1中的值时:

list1=[1,2,3,[4,5]]
list2=list1.copy()
list1[0]=6
print(list2[0])
list1[3][0]=7
print(list2[3][0])

在这里插入图片描述
可以看出,如果是对不可变变量,list1更改值,list2没有影响,但是对于可变变量,改变list1中的值,对list2也有影响。
所以浅拷贝是把原列表第一层的内存地址不进行区分完全copy一份给新列表

浅拷贝原理:
在这里插入图片描述

2、深copy
拷贝一个对象,把对象里面的属性也做了拷贝,deepcopy之后完全是另一个对象了,实现完全独立

import copy
list1=[1,2,[3,4]]
list3=copy.deepcopy(list1)
print(id(list1[0]),id(list1[1]),id(list1[2]))
print(id(list3[0]),id(list3[1]),id(list3[2]))

在这里插入图片描述
可知,深copy在面对可变变量时,产生了新的id。

此时,将List1 [ 2 ]里面的值进行修改

list1[2][0]=5
print(list3[2][0])
print(list1[2][0])

在这里插入图片描述
丝毫不影响list3[2]的值

深拷贝原理: 与浅拷贝区别在对于可变变量的拷贝,深拷贝在拷贝时,会产生新的id将可变变量拷贝到新的容器中,即使原对象中可变变量更改,也不会影响到新拷贝的对象。

拷贝后:
在这里插入图片描述

更改后:
在这里插入图片描述

while循环

语法如下:

while 条件:
	代码1
	代码2

eg:

i = 0
while i < 5:
    print(i)
    i += 1

在这里插入图片描述

while循环的应用
帐号、密码输入,登录成功退出循环,登录失败继续登录

# 1、结束循环
# 方法一、条件改为False
i = 1
while (i==1):
    name = input("请输入你的帐号:")
    password = input("请输入你的密码:")
    if (name == "张三" and password == "123456"):
        print("登录成功")
        i = 0
    else:
        print("帐号或者密码错误")
print("===end===") 
#方法二、break:跳出本次循环
while (True):
    name = input("请输入你的帐号:")
    password = input("请输入你的密码:")
    if (name == "张三" and password == "123456"):
        print("登录成功")
        break
    else:
        print("帐号或者密码错误")
print("===end===")

while循环的嵌套
实例:简单实现ATM机

i = 1
s = 1
while (i <= 3 and s == 1):
    name = input("请输入你的帐号:")
    password = input("请输入你的密码:")
    if (name == "张三" and password == "123456"):
        print("登录成功")
        while(s == 1):
            print("主菜单:1、查询余额 2、转账 3、取款 0、退出系统")
            cmd = input("请输入要进行的操作:")
            while(cmd != "0"):
                if (cmd == "1"):
                    print("您的账户余额是0")
                    input("按下0:返回主菜单")
                    break
                elif (cmd == "2"):
                    transfer_account = input("请输入要转账的账户:")
                    trasfer_money = input("请输入要转账的金额:")
                    print("转账失败,账户内金额不足")
                    input("0:返回主菜单:")
                    break
                elif (cmd == "3"):
                    draw = input("请输入要取款的金额:")
                    print("取款失败,账户内金额不足")
                    input("按下0:返回主菜单:")
                    break
            if(cmd == "0"):
                s = 0
    else:
        print("帐号或者密码错误")
        i += 1
print("===end===")

while +continue :结束本次循环,重新回到循环
以上一个例子:

s = 1
i = 1
while (i <= 3 and s == 1):
    name = input("请输入你的帐号:")
    password = input("请输入你的密码:")
    if (name == "张三" and password == "123456"):
        print("登录成功")
        while(1):
            print("主菜单:1、查询余额 2、转账 3、取款 0、退出系统")
            cmd = input("请输入要进行的操作:")
            if (cmd == "1"):
                print("您的账户余额是0")
                input("按下0:返回主菜单:")
                continue
            elif (cmd == "2"):
                transfer_account = input("请输入要转账的账户:")
                trasfer_money = input("请输入要转账的金额:")
                print("转账失败,账户内金额不足")
                input("0:返回主菜单:")
                continue
            elif (cmd == "3"):
                draw = input("请输入要取款的金额:")
                print("取款失败,账户内金额不足")
                input("按下0:返回主菜单:")
                continue
            elif(cmd == "0"):
                s = 0
                break
    else:
        print("帐号或者密码错误")
        i += 1
print("===end===")

相比上一个例子,减少了一次循环。
在使用continue的时候,一定要注意条件累加问题。

while + else
else只有在while正常循环结束之后,才会执行。如果while是被break语句中途结束循环,else循环不会执行。

i = 1
while(i < 13):
    print("111")
    i += 1
else:
    print("hehe")

在这里插入图片描述

while循环被break中途结束:

i = 1
while(i < 13):
    print("111")
    i += 1
    if i == 3:
        break
else:
    print("hehe")

在这里插入图片描述
将while + else语句加入ATM例子中:
当密码输出错误次数超过三次时,提示用户,并且退出系统

s = 1
i = 1
while (i <= 3):
    if(s==0):
        break
    name = input("请输入你的帐号:")
    password = input("请输入你的密码:")
    if (name == "张三" and password == "123456"):
        print("登录成功")
        while(i <= 3):
            print("主菜单:1、查询余额 2、转账 3、取款 0、退出系统")
            cmd = input("请输入要进行的操作:")
            if (cmd == "1"):
                print("您的账户余额是0")
                input("按下0:返回主菜单:")
                continue
            elif (cmd == "2"):
                transfer_account = input("请输入要转账的账户:")
                trasfer_money = input("请输入要转账的金额:")
                print("转账失败,账户内金额不足")
                input("0:返回主菜单:")
                continue
            elif (cmd == "3"):
                draw = input("请输入要取款的金额:")
                print("取款失败,账户内金额不足")
                input("按下0:返回主菜单:")
                continue
            elif(cmd == "0"):
                s = 0
                break
    else:
        print("帐号或者密码错误")
        i += 1
else:
    print("密码输入次数超过3次,不允许再次登录")
print("===系统退出===")

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值