python理论加强(一)

GIL(全局解释器锁)

  • GIL只应用于Cpython解释器,GIL是把互斥锁
  • 由于Cpython无法应对多个线程同时对系统资源的请求,所以需要GIL对全局资源上锁,使得线程能交替(并发)使用全局资源
  • GIL是解释器层面的,互斥锁是代码层面的,注意线程对全局变量的使用还是要加互斥锁
    在这里插入图片描述
  • GIL锁在线程执行完,线程阻塞,超时时自动释放,如不存在以上条件,则根据其计数器结束
  • GIL影响:多线程交替并发执行,不能利用多核cpu。如想避免这些影响,可以使用多进程或者用c,c++写多线程函数再由python调用

python运算符问题

python中运算符计算实际上是解释器自动调用魔法方法,如__add__,__sub__

在这里插入图片描述

python整除,取余

在这里插入图片描述

赋值,浅拷贝,深拷贝

  • 赋值是引用的传递,两个对象指向的同一片空间

在这里插入图片描述

  • 浅拷贝

    浅拷贝只拷贝目标顶级的引用,不会对结构层次进行拷贝,如下b浅拷贝只是把a[3]列表的引用进行的拷贝,当a[3]列表内容改变时,b也随之更改

    import copy
    a=[1,2,3,[4,5]]
    b=copy.copy(a)
    
    a[3].append(3)
    
    # a=[1,2,3,[4,5,3]]
    # b=[1,2,3,[4,5,3]]
    

在这里插入图片描述

  • 深拷贝

    深拷贝相对于浅拷贝来说,深拷贝会对所有层次结构进行拷贝

    import copy
    a=[1,2,3,[4,5]]
    b=copy.copy(a)
    
    a[3].append(3)
    
    # a=[1,2,3,[4,5,3]]
    # b=[1,2,3,[4,5]]
    

在这里插入图片描述

  • 分片属于浅拷贝

  • copy.copy对于可变类型,会进行浅拷贝

  • copy.copy和copy.deepcopy对于不可变类型没有意义,全部等价于对象之间的赋值操作。

import模块导入

import 导入模块
import 模块名

3.1 导入指定目录下的模块

	1 重启之后需要重新添加路径 重新导入
		import sys
		修改sys.path变量中路径 

	2 修改之后一直有效 

	  vim ~/.bashrc
	  export PYTHONPATH=$PYTHONPATH:/home/python/Desktop
	  保存退出  刷新文件
	  :wq      source ~/.bashrc
3.2 重新加载模块

	因为import在第一次导入的时候会创建一个模块对象 
	当后续再次import 的时候  会直接使用已有的模块对象

	py2 
		reload(myapp)

	py3
		from imp impor reload
		reload(myapp)

3.3 import A 过程
	1 先判断模块A是否存在模块对象 存在就直接使用 ; 如果没有进行2
	2 sys.path路径下进行模块的搜索A.py文件 如果能够找到就进行3  否则报错
	3 根据磁盘的py文件  创建模块对象 并且 在当前作用域创建一个和模块名同名的对象 A
		A对象中保存的时候 模块对象的引用
	4 通过A调用其中任何方法  函数  类 变量

3.4 from A import B
	1 先判断模块A是否存在模块对象 存在就直接使用 ; 如果没有进行2
	2 sys.path路径下进行模块的搜索A.py文件 如果能够找到就进行3  否则报错
	3 根据磁盘的py文件  创建模块对象 并且 在当前作用域创建一个 和模块中属性同名的 对象B
	4 通过B调用

3.5 from-import 和 import区别
	locals()查看当前作用域中 名字

	from-import 保存模块中属性的引用在本地作用域
	import      保存模块的     引用在本地作用域

猜你喜欢

转载自blog.csdn.net/qq_36217796/article/details/83661983