Python_别名-深拷贝和浅拷贝

变量和类型

从CPU执行的角度--汇编语言
    编程具体到物理层--指令区 & 变量区
	  CPU 可以根据某些寄存器上存的数据找到内存上的区域,并进行读写操作
      CPU 访问内存时需要的是地址,而不是变量名和函数名!
	    变量名和函数名只是地址的一种助记符,当源文件被编译和链接成可执行程序后,它们都会被替换成地址。
	    编译和链接过程的一项重要任务就是找到这些名称所对应的地址。
		
	按照数学方式来描述计算过程,可以没有变量-计算机硬件不能像数学家描述的理想情况一样理想化
       高级语言也要迁就于机器语言,一块内存要反复用-充分利用硬件资源	
	   随着科技发展-比如量子计算机应用等可能描述方式就会发生时代性的改变
		
	变量类型 --类型系统
        是什么数据,它占用多长的空间, 可以进行什么样的操作 变量的类型定义了这个变量所能够支持的操作的集合
		 类型约束-类型多态--类型组合 
		1、根据类型安排合适的操作 2、借助类型系统发现部分逻辑错误

    关键在于编译出正确的二进制文件--怎么编译出正确的二进制文件呢-字节序列	(施加约束)对数据进行信息抽象的定义-量纲分析
        定长数据-变长数据
             定长数据  不同的种类--类型。
             变长数据  动态分配问题
        静态区,一个变量一旦存上去了,它的前方后方都紧靠着别的数据,大家的位置都是固定的,长度也是固定的,程序也依赖于这些数据的固定性来找到和处理它们		  

    类型是值的抽象域

数据结构

 数据类型: 单个数据元素的属性和处理(如数据的大小、范围)
 数据结构: 数据元素的整体组织和操作(如元素之间的关系)

 数据结构是一种存储和组织数据的方式,旨在提高数据访问和修改的效率。
     它主要关注数据元素之间的关系和布局,以及如何高效地处理这些数据
 数据格式 
    数据如何被存储、读取和交换

上下文 (context)

执行顺序---顺序执行-选择执行-条件分支-循环执行- 本质就是 PC 值的变化,PC 值永远存储的是即将运行的下一条指令的地址
   -函数也是一种执行顺序--跳转,和单纯的跳转不同
       函数调用需要在完成函数内部的处理之后,
	     处理流程再返回到函数调用点,也就是返回到函数调用指令的下一条指令,因此针对于函数调用来讲,涉及到函数返回地址的处理
 函数返回地址进行压栈-堆栈的机制,堆栈的特性是先入后出		 
函数的调用机制

上下文切换(context switch)定 上下文切换指的是内核(操作系统的核心)在CPU上对进程或者线程进行切换
    包括处理器的寄存器状态、程序计数器、堆栈指针、内存管理信息以及其他任务特定的数据
	 Thread Context
函数上下文 --作用域 闭包 Closure
    函数所在的 scope-当前正在运行的函数所在的范围。它是一个包含了函数参数和本地变量的环境,函数在执行时会使用这个环境中的变量
   变量环境-词法环境等	
 作用域上下文定义了变量的可见性和生命周期
 安全上下文(Security Context) 上下文可能包含用户认证信息、权限和角色等。
 网络请求上下 上下文可能包含请求和响应的详细信息,如HTTP头部、请求体、状态码等	
Environment

python上下文

 上下文管理器是资源管理的绝佳
   类的 with 语句,我们必须实现 __enter__ 和 __exit__ 方法。 
       当执行进入 with 语句的上下文时,Python调用 __enter__。 在这里,应该获取资源并将其返回。 
	   当执行再次离开上下文时,将调用 __exit__ 并释放资源。
	      如果执行发生异常,Python将类型,值和回溯传递给 __exit__ 方法。 它可以在这里处理异常


 Contextlib库是其中之一,它提供了一些用于支持上下文管理协议(即with语句)的函数。
   contextmanager 装饰器	
   closing 函数 是一个帮助函数,用来确保对象的close方法在完成后被正确的调用。
    contextlib.contextmanager 装饰器对其进行装饰。 
	  然后,我们也可以使用 with 语句调用该函数。 
	  对于这种方法,函数必须在 try 语句中 yield 资源,
	  并且释放资源的 __exit__ 方法的所有内容现在都在相应的 finally 语句内	   

深拷贝和浅拷贝

  别名是指给对象赋予一个新的名称,操作别名实际上是在操作同一个对象;
    而深层复制和浅复制是创建新的对象。浅复制只复制了原始对象的引用。
  
浅拷贝和深拷贝更多地涉及到涉及到指针成员的对象的拷贝行为,而对于普通变量,只需要关注其值的复制即可。
别名(Alias):在Python中,可以通过给对象赋予一个新的名称来创建别名 
   
 浅拷贝 Shallow Copy
  浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。
     如果属性是基本类型,拷贝的就是基本类型的值,
	 如果属性是引用类型,拷贝的就是内存地址 ,
	所以如果其中一个对象改变了这个地址,就会影响到另一个对象。
       新旧对象还是共享同一块内存
 深拷贝 Deep Copy
   深拷贝是将一个对象从内存中完整的拷贝一份出来,
    从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象
  深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象

调试和测试

调试
  非侵入式调试
    侵入式调试: 

命令行的方式 -非侵入式调试
     python -m pdb main.py
	 
	    b/break 命令来设置断点
	    cl/clear 命令来清除断点
		 p 命令来查看变量的值
		 
Python的调试器 pdb.set_trace()
     import pdb
     
     
    ###调试的方式 
      设置断点、调试控制
         开始/暂停、步过 (Step Over)、步入 (Step Into)、步出 (Step Out)、重新开始和停止调试会话。
	
图形化界面的方式
   1.设置断点   代码中设置断点,只需单击左侧行号边上的空格。标有红点的行是断点,程序运行到这里会暂停,允许你检查变量状态、步进代码
   2.Start Debugging	
       最上方出现的调试工具栏让你可以执行常规的调试操作,如开始/暂停、步过 (Step Over)、步入 (Step Into)、步出 (Step Out)、	   
  
追踪 
   import traceback

单元测试
   mock已经被集成到了unittest单元测试框架中,所以可以直接使用。在代码中直接import进来就可以使用mock了。
    from unittest import mock
    使用一个替身对象来模拟它,然后使用断言来确认结果
    
    异常处理和错误处理

 vscode   
         terminal  
	     debug console  
	     problems 
	     output
     outline
	 timeline

可观测性

 监控方案
   可观测性主要从日志(Log)、指标(Metric)和追踪(Trace)	
       指标‌是对系统和应用程序性能进行量化的数值数据
	   ‌追踪‌记录和分析服务间调用的过程,帮助理解请求在系统中的传递路径和延迟,
	    对于分布式系统中性能问题的诊断和解决尤为重要
    Log是离散的事件,Trace可以认为是带请求追踪的事件,Metric是带统计量的事件

参考

 Python 进阶 https://python-advanced.qiwihui.com/zh-cn/latest/index.html	
 https://www.python-engineer.com/courses/advancedpython/01-lists/
 https://python3-cookbook.readthedocs.io/zh-cn/latest
posted @ 2024-11-28 11:00  辰令  阅读(16)  评论(0编辑  收藏  举报