- 一、"is" 与 "=" 的区别
- 1. is判断的是a对象是否就是b对象,是通过id来判断的。判断的是不是一个地址,比较两个引用是否指向了同一个对象
- 2. = 判断的是两个变量的内容(值)是否相等,
- 3.两个无引用关系的列表(或字典或元组)的内容即使相同,地址也不相同,两个字符串(或数值),内容相同,地址相同
- 二、浅拷贝和深拷贝
- 1.好处:减少内存使用,对数据进行备份,预防不正确清除或修改数据
- 2.import copy
- copy.copy(拷贝的内容) 浅拷贝
- copy.deepcopy(拷贝的内容) 深拷贝
- 3.浅拷贝
- 1.产生新的地址保存内容
- 2.内容
- 1.改变原数据的字符串(整数) 地址也会改变,新数据不变
- 2.改变原数据的列表(字典) 地址不会改变,新数据也改变
- 3.切片也为浅拷贝,字典自带的copy方法为浅拷贝
- 4.深拷贝
- 1.产生新的地址保存内容
- 2.原数据内容改变,新数据也不变
- 5.如果进行元组拷贝,元组内容是纯原子类型(数值,字符串)则不能进行拷贝(拷贝后地址一样)
- 元组内容有非原子类型(列表,字典) 则能进行拷贝
- 6.总结
- 1.Python中对象的赋值都是进行对象引用(内存地址)传递
- 2.使用copy.copy(),可以进行对象的浅拷贝,它复制了对象,但对于对象中的元素,依然使用原始的引用.
- 3.如果需要复制一个容器对象(例如列表,),以及它里面的所有元素(包含元素的子元素),可以使用copy.deepcopy()进行深拷贝
- 4.对于非容器类型(如数字、字符串、和其他'原子'类型的对象(元组))没有被拷贝一说
- 5.如果元祖变量只包含原子类型对象,则不能拷贝。
- 三、进制,位运算
- 1.python中二进制 以0b 开头如,"0b101",八进制0o开头,十六进制0x开头
- 2.转换
- 1.二进制转十进制 int("0b10112",2) -->23
- 2.八进制转十进制 int("0o27",8) -->23
- 3.十六进制转十进制 int("0xa8",16) -->168
- 4.十进制转二进制 bin(10) -->"0b1010"
- 5.十进制转八进制 oct(100) -->"0o144"
- 6.十进制转十六进制 hex(100) -->"0x64"
- 3.原码,反码,补码
- 数字在计算机中是以二进制补码的形式保存的,计算时是以补码运算的,符号位是最前面的那一位,0为正,1为负
- 正数的原码=反码=补码
- 负数:反码=符号位不变,其他位取反 0变1,1变0
- 补码=反码+1
- 补码转码原码:符号位不变,数据位取反,尾数+1
- 4.位运算
- 1.左移 数值<<位数 左移几位就是 数值*2的几次方
- 2.右移 数值>>位数 右移几位就是 数值/2的几次方(整数)
- 3.按位于 & 全1为1,否则为0
- 4.按位或 | 有1就为1,
- 5.按位异或 ^ 不同为1,相同为0
- 四,作用域
- 1.Python使用叫做命名空间的东西来记录变量的轨迹。命名空间是一个字典(dictionary) ,它的键就是变量名,它的值就是那些变量的值。
- 2.命名空间
- 1、每个函数都有着自已的命名空间,叫做局部命名空间,它记录了函数的变量,包括函数的参数和局部定义的变量。
- 2、每个模块拥有它自已的命名空间,叫做全局命名空间,它记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
- 3、还有就是内置命名空间,任何模块均可访问它,它存放着内置的函数和异常。
- 3.作用域:局部变量和全局变量,之所有称之为局部、全局,就是因为他们的自作用的区域不同,这就是作用域。
- 注意:类没有作用域
- 4.locals() 查看当前局部命名空间中的可以使用的变量,函数,类,返回一个字典
- 5.globals() 查看当前全局命名空间中可以使用的变量,函数,类,返回一个字典
- 6.python中使用变量,函数,类遵循 L-E-G-B 规则 来查找命名空间中的该变量,函数,类
- 1.L locals 局部命名空间 (函数内的名字空间) 函数的参数也属于命名空间内的变量.
- 2.E enclosing function 外部嵌套函数的命名空间 (闭包)
- 3.G globals 全局命名空间 (函数定义所在模块(文件)的名字空间)
- 4.B builtins 内建模块的命名空间
- 五、私有化
- 1、xx: 公有变量
- _x: 单前置下划线,受保护的变量
- __xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到),私有的
- __xx__:双前后下划线,用户名字空间的魔法对象或属性。例如:__init__ , __ 不要自己发明这样的名字
- xx_:单后置下划线,用于避免与Python关键词的冲突
- 2.
- 1.通过 from 模块 import * 导入模块 ,不能使用模块中以单前置下划线的变量,函数,类和双前置下划线的私有
- 2.通过 from 模块 import _name,__age ,可以使用单前置下划线的变量,函数,类和双前置下划线的私有
- 3.通过 import 模块,可以使用单前置下划线的变量,函数,类和双前置下划线的私有
- 3.类中定义单前置下划线的属性,方法,继承可以使用,类外可以直接访问
- 类中定义双前置下划线的属性,方法,继承不可以使用,类外不可以直接访问
- 1、xx: 公有变量
- 六、属性property
- 1.类中通过添加get和set方法,获取和修改私有属性值
- 2.在1的基础上,在类中添加属性 属性=property(get方法,set方法) property中方法不加括号get在前,set在后
- 在类外就可以通过,类对象.属性 获取私有属性值, 和类对象.属性=值 修改私有属性值
- 3.在类中定义
- @property
- def 属性(self):
- return self.__属性
- @属性.setter():
- def 属性(self,值):
- self.__属性=值
- 使用:
- 在类外就可以通过,类对象.属性 获取私有属性值, 和类对象.属性=值 修改私有属性值