深浅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("===系统退出===")