一、深拷贝、浅拷贝
1、需求
1)拷贝原列表产生一个新列表
2)想让两个列表完全独立开(针对改操作,读的操作不改变)
要满足上述的条件,只能使用深拷贝
2、如何拷贝列表
1)直接赋值
py
# 定义一个数组
list1=[
"paipai",
"3",
[10,3]
]
# 1、使用赋值的方式,值的变动肯定是对等的
list2=list1
print(list1)
print(list2)
# 重新为list1赋值
list1[0]='achao'
print(list1)
print(list2)
执行结果
py
/usr/local/bin/python3.8 /Users/achao/PycharmProjects/Achao/day07/深浅拷贝&while循环.py
['paipai', '3', [10, 3]]
['paipai', '3', [10, 3]]
['achao', '3', [10, 3]]
['achao', '3', [10, 3]]
Process finished with exit code 0
2)浅拷贝 xxx.copy()
实现方式🔽
py
# 定义一个列表
list1 = [
'paipai',
'eat',
[3, 12]
]
# 使用浅拷贝
list2 = list1.copy()
print(list1)
print(list2)
# 修改list1中的值但是list2中的值不会随之改变
list1[2][1] = 'chaochao'
list1[1] = 'sleep'
print(list1)
print(list2)
print(id(list1[0]),id(list1[1]),id(list1[2]))
print(id(list2[0]),id(list2[1]),id(list2[2]))
执行结果
py
/usr/local/bin/python3.9 /Users/yincheng/local/study/Python基础/2024-11/day07/深浅拷贝.py
['paipai', 'eat', [3, 12]]
['paipai', 'eat', [3, 12]]
['paipai', 'sleep', [3, 'chaochao']]
['paipai', 'eat', [3, 'chaochao']]
4302011504 4302021232 4303476416
4302011504 4302021232 4303476416
Process finished with exit code 0
可以看出使用浅拷贝时,当修改原列表中不可变的元素(不可变类型的赋值)时,复制出的列表值是不会随之改变的,但是,如果原列表中修改的值是可变元素,那么复制出的列表值也是会随之变化的。
1)对于不可变类型的赋值:
赋值都是产生了新的值,让原列表的索引指向新的内存地址,所以并不会影响到新拷贝过去的列表
2)对于可变类型的赋值
虽然改变了可变类型中包含的值,但是整体的内存地址是不变的。新复制的列表的索引仍然指向原来的内存地址,但内存地址中存放的值的内存地址已经改变,所以大家就都变了
总结 :浅copy是把原列表第一层的内存地址不加区分完全copy一份给新列表。
原理图:
3) 深拷贝 新列表名=copy.deepcopy(要复制的列表名)
说明 :对每一层数据都做一个区分(区分对应的数据类型是否可变)
根据浅拷贝的表现。要想copy得到新列表与原列表的改操作完全独立开,必须有一种可以区分开可变类型与不可变类型的copy机制,这就是深copy。
但复制的数据类型可变时,会产生一个新的地址空间
py
# 2)深拷贝
import copy
list1 = [
'paipai', # 不可变
'eat', # 不可变
[3, 12] # 可变
]
list2 = copy.deepcopy(list1)
# print(id(list1))
# print(id(list2))
# print(id(list1[0]),id(list1[1]),id(list1[2]))
# print(id(list2[0]),id(list2[1]),id(list2[2]))
print(id(list2))
print(id(list1[2][0]), id(list1[2][1]))
print(id(list2[2][0]), id(list2[2][1]))
# 修改原列表的值,可以发现只有原列表的值被改变了,copy出来的值是没有被改变的
list1[2][1] = 18
print(id(list1[2][0]), id(list1[2][1]))
print(id(list2[2][0]), id(list2[2][1]))
执行结果🔽
py
/usr/local/bin/python3.9 /Users/yincheng/local/study/Python基础/2024-11/day07/深浅拷贝.py
4300084288
4296927600 4296927888
4296927600 4296927888
4296927600 4296928080
4296927600 4296927888
原理图
4)总结
深拷贝与浅拷贝最本质的区别
浅拷贝 |
---|
深拷贝 |
二、while循环(条件循环)
1、定义
2、样式
python
while 条件:
代码1
代码2
代码3
print('循环结束开始执行其他代码')
代码块
py
count = 0
while count < 5:
print(count)
count += 1
print("循环结束啦,开始执行其他代码")
执行结果
py
/usr/local/bin/python3.9 /Users/yincheng/local/study/Python基础/2024-11/day02/while循环练习.py
0
1
2
3
4
循环结束啦,开始执行其他代码
Process finished with exit code 0
3、死循环与效率问题
py
# 1)死循环与效率问题
count=0
while count < 5 :
print(count) #会一直输出0
# 2)直接将条件写为真
while True:
name=input('your name is:') #有用户交互(io)的死循环输入对终端的性能影响问题<纯计算问题
print(name)
# 3)纯计算无io死循环问题
while True:
print(1+1)
4、循环应用
1)for循环
遍历序列或其它可迭代对象
py
for 变量 in 可迭代对象:
循环体
示例:找到一个大于3的数字,并退出循环
py
list1=[1,2,3,4,5]
for num in list1:
print(list)
if num>3
print("找到第一个大于3的数字:{num}")
break
2)while循环
🧬 基于条件重复执行代码块
while循环在给定条件为True时才会执行循环体
python
count =0
while count <5:
print(count)
count+=1
进阶使用:验证用户账号密码是否正确,给出对应的提示;若验证失败,需要启动循环让用户可以一直输入
**☝🏻第一步:**先实现账号密码验证逻辑正常
py
name = "paipai"
password = '123'
username = input("请输入你的用户名:")
userpassword = input("请输入你的密码:")
if username==name and userpassword==password:
print("账号密码验证通过,登录成功")
else:
print("账号或密码输入失败,请重新登陆")
🔽执行结果
py
#验证成功时
/usr/local/bin/python3.9 /Users/yincheng/local/study/Python基础/2024-11/day07/while循环实际应用.py
请输入你的用户名:paipai
请输入你的密码:123
账号密码验证成功,可以直接登录
Process finished with exit code 0
# 验证失败时
/usr/local/bin/python3.9 /Users/yincheng/local/study/Python基础/2024-11/day07/while循环实际应用.py
请输入你的用户名:KKK
请输入你的密码:hhhh
账号或密码输入失败,请重新登陆
Process finished with exit code 0
可以看到,当验证失败时,理论上用户要可以再次输入账号密码的,也就是代码要可以循环执行,此时引入while
✌🏻第二步 利用while实现循环
py
name = "paipai"
password = '123'
while True:
username = input("请输入你的用户名:")
userpassword = input("请输入你的密码:")
if username == name and userpassword == password:
print("账号密码验证通过,登录成功")
else:
print("账号或密码输入失败,请重新登陆")
🔽执行结果
py
#验证失败时(符合预期)
/usr/local/bin/python3.9 /Users/yincheng/local/study/Python基础/2024-11/day07/while循环实际应用.py
请输入你的用户名:123
请输入你的密码:123
账号或密码输入失败,请重新登陆
请输入你的用户名:
#验证成功时(不符合预期,用户账号密码都已经验证通过,但是仍然需要用户再次输入,当条件满足时,循环体缺少一个终止的机制)
/usr/local/bin/python3.9 /Users/yincheng/local/study/Python基础/2024-11/day07/while循环实际应用.py
请输入你的用户名:paipai
请输入你的密码:123
账号密码验证通过,登录成功
请输入你的用户名:
3)退出循环
方式一:将while循环的条件改为False,等到下次循环判断条件时才会生效
py
# 终止循环
name = "paipai"
password = '123'
tag = True
while tag:
tag = False# 本次循环中的代码会继续执行,只有在下次循环条件判断时,tag的值才发生改变
username = input("请输入你的用户名:")
userpassword = input("请输入你的密码:")
if username == name and userpassword == password:
print("账号密码验证通过,登录成功")
else:
print("账号或密码输入失败,请重新登陆")
print("代码会继续执行到这里")
🔽执行结果
py
# 验证成功时(符合预期)
/usr/local/bin/python3.9 /Users/yincheng/local/study/Python基础/2024-11/day07/while循环实际应用.py
请输入你的用户名:paipai
请输入你的密码:123
账号密码验证通过,登录成功
代码会继续执行到这里
Process finished with exit code 0
# 验证失败时(不符合预期)
/usr/local/bin/python3.9 /Users/yincheng/local/study/Python基础/2024-11/day07/while循环实际应用.py
请输入你的用户名:123
请输入你的密码:123
账号或密码输入失败,请重新登陆
代码会继续执行到这里
Process finished with exit code 0
❓如何使用方式一来满足验证成功就不循环执行,验证不成功就循环执行呢
只需要把结束循环的条件赋值修改语句换个位置就好了
py
# 终止循环
name = "paipai"
password = '123'
tag = True
while tag:
username = input("请输入你的用户名:")
userpassword = input("请输入你的密码:")
if username == name and userpassword == password:
print("账号密码验证通过,登录成功")
tag = False # 本次循环中的代码会继续执行,只有在下次循环条件判断时,tag的值才发生改变
else:
print("账号或密码输入失败,请重新登陆")
print("代码会继续执行到这里")
🔽执行结果
py
# 验证成功时(符合预期)
/usr/local/bin/python3.9 /Users/yincheng/local/study/Python基础/2024-11/day07/while循环实际应用.py
请输入你的用户名:paipai
请输入你的密码:123
账号密码验证通过,登录成功
代码会继续执行到这里
Process finished with exit code 0
# 验证失败时(会继续循环提示我重新输入,符合预期)
/usr/local/bin/python3.9 /Users/yincheng/local/study/Python基础/2024-11/day07/while循环实际应用.py
请输入你的用户名:123
请输入你的密码:1243
账号或密码输入失败,请重新登陆
代码会继续执行到这里
请输入你的用户名:11
请输入你的密码:
方式二:break,只要运行到break就会立刻终止本层循环
在循环体内,使用控制语句来改变循环的执行流程;
- break,终止最内部的循环
py
🔽执行结果
py
# 验证成功时(符合预期)
/usr/local/bin/python3.9 /Users/yincheng/local/study/Python基础/2024-11/day07/while循环实际应用.py
请输入你的用户名:paipai
请输入你的密码:123
账号密码验证通过,登录成功
Process finished with exit code 0
# 验证失败时(完美符合预期)
/usr/local/bin/python3.9 /Users/yincheng/local/study/Python基础/2024-11/day07/while循环实际应用.py
请输入你的用户名:123
请输入你的密码:124
账号或密码输入失败,请重新登陆
代码会继续执行到这里
请输入你的用户名:
总结:如果while循环代码后面还需要执行其他代码,就用修改while条件判断的方式