专栏介绍:

本专栏为Python全栈开发系列文章,技术包括Python基础、函数、文件、面向对象、网络编程、并发编程、MySQL数据库、HTML、JavaScript、CSS、JQuery、bootstrap、WSGI、Django、Flask、后期运维、git使用、Linux运维、Python结合Shell结合场景开发自动化脚本等一系列文章. 从入门到实战。 文章内容来自博主学习笔记,修整发布。

目录:

  • 专栏介绍:
  • 一、深浅copy
    • 1.1 浅拷贝
    • 1.2 深拷贝 copy.deepcopy 方法
  • 二、流程控制的循环之while循环
    • 2.1 while循环的基本使用
    • 2.2 死循环的效率问题
    • 2.3 while循环退出的两种方式
      • 2.3.1 条件改为false
      • 2.3.2 while+break
    • 2.4 while循环的嵌套
    • 2.5 while+contiue
    • 2.6 while+else
  • 结束:

一、深浅copy


首先深浅copy都是复制某个数据的意思,深浅拷贝指的就是在复制的时候对于值的内存空间地址有不同的一层区分,深拷贝对于复制可变类型的数据时会对内存当中值的可变不可变类型加以区分,而浅拷贝不会这么做,浅拷贝不会区分内存值的一个可变与不可变类型,只是复制第一层的内容。

1.1 浅拷贝

l1 = [111,222,333,[444,555,666]]
l2 = l1.copy()print('这是copy后两个列表的内容'.center(50, '*'))
print(l1)
print(l2)print('这是copy后两个列表的内存id'.center(50, '*'))
print(id(l1))
print(id(l2))  # l2的复制后的列表是在内存地址当中新开辟了一个新的内存地址来存放列表print('这是copy后两个列表中的“值”的内存id'.center(50, '*'))
print(id(l1[0]),id(l1[1]), id(l1[2]), id(l1[3]))
print(id(l2[0]),id(l2[1]), id(l2[2]), id(l2[3]))print('修改l1列表当中index0-3的值'.center(50, '*'))
l1[0] = 11111
l1[1] = 22222
l1[2] = 33333print(l1)
print(l2)print('修改l1列表当中的可变类型'.center(50, '*'))
l1[3][1] = 44444444
print(l1)
print(l2)[11111, 22222, 33333, [444, 555, 666]]
[111, 222, 333, [444, 555, 666]]
PS I:\python全栈开发> & D:/python/python3.7/python.exe i:/python全栈开发/python_develop/copy.py
******************这是copy后两个列表的内容******************
[111, 222, 333, [444, 555, 666]]
[111, 222, 333, [444, 555, 666]]
*****************这是copy后两个列表的内存id*****************
2532532970184
2532533433352
**************这是copy后两个列表中的“值”的内存id***************
140710193885264 140710193888816 2532504520592 2532532970120
140710193885264 140710193888816 2532504520592 2532532970120
****************修改l1列表当中index0-3的值****************
[11111, 22222, 33333, [444, 555, 666]]
[111, 222, 333, [444, 555, 666]]
******************修改l1列表当中的可变类型*******************
[11111, 22222, 33333, [444, 44444444, 666]]
[111, 222, 333, [444, 44444444, 666]]

使用列表的方法:.copy 默认为浅拷贝,那么浅拷贝也就说,对于列表当中的不可变类型会原封不动的拷贝,会创建一个新的内存地址用来存放[],那么其中的不可变类型的值与可变类型的值不会加以区分,会原封不动的拷贝过来,内存地址都会指向原来值的内存地址, 那么当原列表的不可变类型发生改变后,对于原列表来讲这是一个新的创造内存空间地址的操作,所以不会影响到新的l2,那么当l1的可变类型列表进行修改操作的时候,由于l2当中copy的可变类型不会加以区分,所以当l1发生改变之后,l2也会发生改变,那么这样的话浅拷贝是有问题的,如果只读的话没有问题,但是如果涉及到不同的内容需要写入列表操作的时候,就有问题。 深拷贝解决了这样的问题

1.2 深拷贝 copy.deepcopy 方法

import copy
l1 = [111,222,333,[444,555,666]]
l2 = copy.deepcopy(l1)print("深拷贝后l1与l2列表当中的数据".center(50, '*'))
print(l1)
print(l2)print("深拷贝后l1与l2列表当中的数据的内存地址".center(50, '*'))
print(id(l1[0]),id(l1[1]),id(l1[2]),id(l1[3]))
print(id(l2[0]),id(l2[1]),id(l2[2]),id(l2[3]))print("修改l1列表当中所有index的值,查看l2的变化,尤其是可变类型")
l1[0] = 111111111111111
l1[1] = 222222222222222
l1[2] = 333333333333333
l1[3][0] = 4444444444444
l1[3][1] = 5555555555555
l1[3][2] = 6666666666666print('这是修改后的l1的列表内容:{l11}'.format(l11=l1))
print('这是修改后的l2的列表内容:{l22}'.format(l22=l2))*****************深拷贝后l1与l2列表当中的数据*****************
[111, 222, 333, [444, 555, 666]]
[111, 222, 333, [444, 555, 666]]
**************深拷贝后l1与l2列表当中的数据的内存地址***************
140710193885264 140710193888816 2225891002256 2225921619784
140710193885264 140710193888816 2225891002256 2225921750856
修改l1列表当中所有index的值,查看l2的变化,尤其是可变类型
这是修改后的l1的列表内容:[111111111111111, 222222222222222, 333333333333333, [4444444444444, 5555555555555, 6666666666666]]
这是修改后的l2的列表内容:[111, 222, 333, [444, 555, 666]]

通过以上代码发现深拷贝对于l1无论是可变类型还是不可变类型的修改操作不会影响到l2的深拷贝列表,表示着此时l2和l1列表是完全分离状态,深拷贝就是对于深拷贝对象的可变类型与不可变类型加以区分,对可变类型创造了新的内存地址防止修改后的影响

二、流程控制的循环之while循环

2.1 while循环的基本使用

"""
while 条件:   # 条件成立运行代码块,条件不成立则退出代码1代码2代码3
"""

2.2 死循环的效率问题

# 死循环1:
while True:print('hello world')# 死循环2:
while True:1 + 1

注意:凡是死循环涉及到cpu计算操作的循环都是致命的,直接影响代码的效率问题,上面的print是一个io输出操作,但1 + 1无限计算是cpu的计算,这样会导致严重的效率问题。

2.3 while循环退出的两种方式

2.3.1 条件改为false

name = "yanzan"
password = "123"count = True
while count:your_name = input('请您输入账号:')your_password = input('请您输入密码:')if your_name == name and your_password == password:print('登录成功!')else:print('登录失败!')count = False

2.3.2 while+break

name = "yanzan"
password = "123"while True:your_name = input('请您输入账号:')your_password = input('请您输入密码:')if your_name == name and your_password == password:print('登录成功!')else:print('登录失败!')break  # 直接跳出本次循环,简单粗暴

2.4 while循环的嵌套

name = "yanzan"
password = "123"while True:your_name = input('请您输入账号:')your_password = input('请您输入密码:')if your_name == name and your_password == password:print('登录成功!')while True:ml = input("请您输入命令:")if ml == 'q':print('退出成功!!!')breakelse:print('{m}命令正在执行中.....'.format(m=ml))breakelse:print('登录失败!')break  # 直接跳出本次循环,简单粗暴

2.5 while+contiue

跳出本次循环直接进入下一次的循环

count = 0
while count < 6:if count == 3:count += 1continueprint(count)count += 1

2.6 while+else

name = "yanzan"
password = "123"count = True
while count:your_name = input('请您输入账号:')your_password = input('请您输入密码:')if your_name == name and your_password == password:print('登录成功!')while count:ml = input("请您输入命令:")if ml == 'q':print('退出成功!!!')count = Falseelse:print('{m}命令正在执行中.....'.format(m=ml))count = Falseelse:print('登录失败!')count = False
else:print("账号密码失败,此时打印的是while循环中的else,本循环正常退出,没有break打断")

需要注意while+else的用法只是while循环正常退出的情况下,才会调用else,也就是说,不是被break打断while循环并且正常退出,就会运行else的内容。while循环可以理解为条件循环,根据条件循环的一种

结束:

Python全栈开发【基础-09】深浅拷贝+while循环相关推荐

  1. Python全栈开发记录_第一篇(循环练习及杂碎的知识点)

    Python全栈开发记录只为记录全栈开发学习过程中一些难和重要的知识点,还有问题及课后题目,以供自己和他人共同查看.(该篇代码行数大约:300行) 知识点1:优先级:not>and 短路原则:a ...

  2. python全栈开发基础【第二十三篇】线程

    一.什么是线程 线程:顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程 所以,进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才 ...

  3. python全栈开发百度云_老男孩2020最新Python全栈开发基础班+就业班

    |- 数据结构+算法.rar - 485.30 MB |- 串讲.rar - 2.01 GB |- 补充资料.rar - 536.00 MB |- MongoDB.rar - 110.10 MB |- ...

  4. python全栈开发基础【第十七篇】面向对象反射和内置方法

    一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被 ...

  5. Python 全栈开发基础

    python面向对象 python异常处理 python网络编程 python并发编程 临时目录 转载于:https://www.cnblogs.com/fixdq/p/8883304.html

  6. python全栈开发基础【补充】包的补充

    1.包A和包B下有同名模块也不会冲突,因为A.a与B.a来自俩个命名空间 2.常见目录结构 # 创建目录代码 import os os.makedirs('glance/api') os.makedi ...

  7. python全栈开发基础学习过程笔记【18d】os模块

    os模块调用操作系统,对文件和文件夹进行操作 1.头文件 impoet os 2os.getcwd() 作用:当前脚本工作的目录路径 print(os.getcwd()) 输出: ========== ...

  8. python 全栈开发,Day32(知识回顾,网络编程基础)

    python 全栈开发,Day32(知识回顾,网络编程基础) 一.知识回顾 正则模块 正则表达式 元字符 :. 匹配除了回车以外的所有字符\w 数字字母下划线\d 数字\n \s \t 回车 空格 和 ...

  9. python全栈开发中级班全程笔记(第三模块、第一章(1.面向对象基础))

    python全栈开发笔记第三模块           第一部分 第一章 :面向对象(类) 一.面向过程编程1.面向过程编程:主要是过程二字,所谓过程,就是指解决问题的步骤,也可以说是设计一套流水线(机 ...

最新文章

  1. 资料分享:送你一本《数据结构(C#语言版)》电子书!
  2. 快要普通话考试了,急需最后一题的根据话题自由讲话的演讲稿!(不要那些已经被用过...
  3. oracle sys sysman system 介绍
  4. 计算机为什么检测不到u盘启动项,BIOS设置U盘为第一启动项后检测不到如何解决?...
  5. 各种数据结构性能的比较
  6. php 获取某一年最后一天_vivo年货节最后一天!多款机型大促,错过让你后悔再等一年!...
  7. java concurrent 锁_java并发机制锁的类型和实现
  8. #6281. 数列分块入门 5
  9. nginx的addition模块在响应的前后报文添加内容与变量的运行原理
  10. golang mysql scan_在Golang中对MySQL进行操作
  11. [field:picname/]和[field:litpic/]区别
  12. 三星android智能手机usb驱动程序,三星手机驱动官方下载
  13. Linux 下的 MISC 设备驱动
  14. 点击唤起电话功能和企业微信聊天窗口事件(H5)
  15. Matlab 7 win7安装步骤
  16. 输入一个整数n,按要求生成一个n*n的蛇形矩阵
  17. 极智AI | 一文看懂昇腾达芬奇架构计算单元
  18. 男人和女人分别必看的十大电影(共20部)
  19. 刘易远:如何提升自我赋能?
  20. Bank Robbery LightOJ - 1163

热门文章

  1. 【ENOVIA 服务包】知识重用解决方案 | 达索系统百世慧®
  2. 从administrators组中删除guest来宾账户时提示无法在内置账号上运行此操作的解决办法...
  3. 自己用的停用词(2955个)
  4. 拼车小程序的市场应用与外包开发的建议
  5. MDClub一个漂亮轻量的开源论坛系统
  6. 机器学习的L1、L2损失函数
  7. 验证码(CAPTCHA)
  8. php实现数字英文验证码,php 英文、数字验证码的完整代码
  9. HowToDoIt 开源框架爱好者组织发布第一份项目总结
  10. Python实现FP树