深拷贝与浅拷贝
==与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
- 十六进制0
9 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
- 成为属性函数