学无止境

少年辛苦终身事,莫向光阴惰寸功。——唐·杜荀鹤《题弟侄书堂》


深拷贝与浅拷贝

==与is的区别


  • =代表赋值
  • 使用is和==:
  • print(a is b )#a 的地址 is b的地址---->返回布尔值:True 或者False
    
  • Python对小整数对象池的定义是 [-5, 257) 这些整数对象是提前建立好的不会被垃圾回收,在一个Python的程序中,所有位于这个范围内的的整数使用的都是同一个对象
  • ==是比较的两个对象值是否相等
  • is是比较两个引用否指向了同一个对象(引用比较)

拷贝


  • 复制粘贴

浅拷贝

  • 浅拷贝是对于一个对象的顶层拷贝;通俗的理解是:拷贝了引用,并没有拷贝内容;浅拷贝只拷贝父对象,不会拷贝对象的内部的子对象。
  • 浅拷贝:产生的地址(引用)是新的,但是里面引用的元素还是原来的元素
  •  import copy
    
  •  变量1=copy.copy(要拷的变量)
    
  • 拷贝过后地址会变化
  • 什么是浅拷贝:
  • 切片[:1]是浅拷贝
  • 使用工厂函数(如list/dir/set)
  • •使用copy模块中的copy()函数

深拷贝

  • 可变类型都新产生了一份地址,不可变类型就共用一个地址
  • import copy
    
  • list2=copy.deepcopy(list1)
    

拷贝的特殊情况

  • 对于不可变类型,没有拷贝这种说法的
  • 数值:小整数对象池
  • 字符串:字符串驻留机制
  • 元组,:对象不可变
  • 注意:如果是元组,能不能执行深拷贝,取决于元组中得类型是可变还是不可变,只有可变类型的时候才可以执行深拷贝

字典

  • 字典中有copy—->两个地址不相同
  • 内置函数:list—>两个地址不同

3. 进制、位运算

  • 一个字节占8位

补码,反码

  • 二进制:0~1
  • 十进制0~9
  • 十六进制09 AF
  • 八进制0~7
  • 二进制转十进制
  • 基数:2
  • 位权:从右侧的0开始叫做基数
  • 原码,反码,补码
  • 进行运算的时候:补码—》负数
  • 正数:补码=反码
  • 负数:—-》符号位不变取反+1
  • 空出来的全部补符号位不论空几个
  • 补码转原码:符号位不变取反+1

位运算

  • 二进制bin(0b)
  • 八进制oct (0o)
  • 十六进制hex(0x)
  • 位移
  • 左移
  • 用途:快速计算一个数乘以2的n次方 (例如8«3 等同于8*2^3)
  • 5«1 —>5*2^1左移1位
  • 5«2 —->5*2^2左移2位
  • 右移
  • x » n x的所有二进制位向右移动n位,移出的位删掉,移进的位补符号位 右移不会改变一个数的符号
  • x 右移 n 位就相当于除以2的n次方 用途:快速计算一个数除以 2的n次方 (8»3 等同于8/2^3)
  • &按位与
  • | 按位或
  • ^ 按位异或
  • ~ 按位取反
  • « 按位左移
  • 按位右移


作用域


  • 命名空间是一个字典(dictionary)
  • 他的键就是变量名
  • 他的值就是那些变量的值
  • 每个函数都有着自已的命名空间,叫做局部命名空间,它记录了函数的变量,包括函数的参数和局部定义的变量。
  • 每个模块拥有它自己的命名空间,叫做全局命名空间,它记录了模块的变量,包括函数。类,其他导入的模块,模块级的变量和常量
  • 还有就是内置命名空间,任何模块均可访问它,它存放着内置函数的函数和异常

globals locals

  • 命名空间就是记录变量的,通常是通过字典展示变量情况
  • print(locals())
    
  • locals()记录函数你的函数中那些是局部变量
    
  • print(globals())
    
  • globals记录全局变量
    
  • 推荐locals在函数内使用
  • globals在全局使用

LEGB 规则


  • L-Local(function);函数内的名字空间
  • E-Enclosing function locals;外部嵌套函数的名字空间(例如closure(闭包))
  • G-Global(module);函数定义所在模块(文件)的名字空间
  • B-Builtin(Python);Python内置模块的名字空间
  • Python 使用 LEGB 的顺序来查找一个符号对应的对象
  •  locals -> enclosing function -> globals -> builtins
    
  • locals ,当前所在命名空间(如函数,模块),函数的参数也属于命名空房内的变量
  • Enclosing( 封闭):enclosing[In’kloz],外部嵌套函数的命名空间(闭包中常见)
  • globals:globals,全局变量,函数定义所在模块的命名空间
  • builtins(内建)• builtins,内建模块的命名空间。
  •   print("__bulitins__")
    
  •  abs()函数求绝对值的函数
    

私有化


  • xx: 公有变量
  • _x: 单前置下划线,私有化属性或方法
  • from somemodule import *禁止导入,类对象和子类可以访问
    
  • __xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到)
  • xx:双前后下划线,用户名字空间的魔法对象或属性。例如:init , __ 不要自己发明这样的名字
  • xx_:单后置下划线,用于避免与Python关键词的冲突
  • “__“私有的,在函数中可以使用
  • 如果是全局变量是私有的,则函数中可以使用,而类中不能使用
  • 但是”_“的类和函数都能使用
  • 导入的情况下模块中的全局变量中的_xx,__xx均不可被访问
  • 共有:
  • 外界可以直接访问
    
  • 模块中共有
    
  • 私有:
  • 模块中私有:
    
  • 本模块中私有:函数中可以访问,类中不能访问
    
  • 模块中导入私有:_xx本模块中随意使用,
    
  • 但是通过froM模块名import这种方式导入则不可以使用
    
  • 但是导入方式是:import模块名这时就可以使用私有
    
  • print(dir(s))查看某个对象的可用方法
    
  • 名字重整:
  • 类中的私有的属性或者方法进行名字的重新整理—>__age====_类名__age
  • 模块中的私有的属性 _num,_test()在导入的时候有(from…import…),直接给你隐藏起来_属性和_方法

属性property


  • 这个属性就是为了私有属性成立的
  • age=property(get_age,set_age)
  • 注意顺序,get在前set在后
  • @property
  • 成为属性函数