深拷贝和浅拷贝(面试常问)
深拷贝 :拷贝出来的新对象和原对象是不一样的,内存地址也不一致,原对象怎么进行改变都不会影响当前对象
浅拷贝 :对象不一样,但是对象里面的可变元素的地址相同
#深拷贝 修改拷贝后的对象中的数据不影响原对象内容
深拷贝
import copy
list1=[['北京多测师','成都多测师'],'上海多测师','深圳多测师']
list2=copy.deepcopy(list1)#进行深拷贝
#打印列表内存地址--不一致
print(id(list1))#19375496
print(id(list2))#19376008
#打印子列表的内存地址--不一致
print(id(list1[0]))#19375432
print(id(list2[0]))#19391944
#修改拷贝后list2
list2[0][0]='武汉多测师'
print(list2)#[['武汉多测师', '成都多测师'], '上海多测师', '深圳多测师']
print(list1)#[['北京多测师', '成都多测师'], '上海多测师', '深圳多测师'][['北京多测师', '成都多测师'], '上海多测师', '深圳多测师']
#打印修改后的列表,结果list2列表修改了,但不影响list1列表数据
浅拷贝 修改拷贝后的内容,原对象内容随之改变
import copy
list1=[['北京多测师','成都多测师'],'上海多测师','深圳多测师']
list2=copy.copy(list1)#浅拷贝
#打印两个列表的内存地址--不一致
print(id(list1))#19047112
print(id(list2))#19048200
#打印两个子列表内存地址--结果一致
print(id(list1[0]))#18758920
print(id(list2[0]))#18758920
#修改list2列表数据
list2[0][0]='武汉多测师'
print(list2)#[['武汉多测师', '成都多测师'], '上海多测师', '深圳多测师']
print(list1)#[['武汉多测师', '成都多测师'], '上海多测师', '深圳多测师']
#打印修改后的列表,结果list1列表数据随之改变
类与对象
a=2print(id(a))#140707926932576print(type(a))#<class 'int'>b=3print(id(b))#140707926932608print(type(b))#<class 'int'>b=2print(id(b))#140707926932576print(type(b))#<class 'int'>
上述代码可理解为2、3是两个人,a、b分别是题目名字
就算3这个人的名字给到2这个人,2这个人是不会变的;(这里的变指的是内存中的地址)
类:class 定义 用来描述具有相同属性和方法的对象的集合;
可以理解是一个模板,通过它可以创建出无数个具体实例;
对象:类不能直接使用,通过类创建出实例(对象)
比如:这个有点向汽车图纸和汽车的关系,图纸本身(类)不能被人直 接使用,
通过图纸创造出汽车(对象)才能使用;
对象和类的关系:就像模具和铸件的关系
类的实例化的结果就是对象,而对象的抽象体就是类;
属性:类中的所有变量称为属性
在python中定义类通过class 关键字
class Dcs(object):
注:class 后面接着是类名称既Dcs 类名称通常大写开头,
后面(object)表示该类从哪个类继承下来的,如果没有合适的类,就使用object类
对象和类的关系:就像模具和铸剑的关系
类的实例化的结果就是对象,而对象的抽象体就是类;
属性:类中所有变量称为属性
在python中定义通过class 关键字
class dcs(object)
注:class后面接着是类名称既Dcs 类名称通常大写开头
后面(object)表示该类从哪个类继承下来的,如果没有合适的类,就使用object类
类名称定义
不要用纯数字命名
不要以python中保留字符命名
不要以文件名命名
要见到且见名知意
当类名称有多个单词,采用驼峰式--Dcs()
class Dcs(object):#定义类 def add(self,a,b): return a +b def redure(self,a,b): return a -b def ride(self,a,b): return a * b def ott(self,a,b): return a/bd=Dcs()#通过类名称创建对象print(d.add(1,5))#通过对象调用方法print(d.redure(5,2))print(d.ride(2,4))print(d.ott(8,2))
实变量_init_是一个构造函数
class Dcs(object):#定义类 def __init__(self,a,b):#构造函数 self.a = a#实例变量 self.b =b#实例变量 def add(self): return self.a +self.b def redure(self): return self.a -self.b def ride(self): return self.a *self.b def ott(self): return self.a / self.bd=Dcs(16,4)#通过类名称创建对象print(d.add())#通过对象调用方法print(d.redure())print(d.ride())print(d.ott())
当类中的_init_中参数存在,则实例化时需要往实例化括号中传入参数;
不存在参数时,则实例化时不需要往实例化括号中传参,而在调用方法时进行传参;
a=300#全局变量class dcs():#定义类 a1=200#类变量(如果方法中调用它,需要加self) def __init__(self,name):#构造函数 self.a2=name#实例变量 #把形参变为实例变量(类的全局变量) #实例变量当前类中,只要是带有sele的都可以使用 def A1(self): print(self.a2)#打印实例变量 print(self.a1))#打印类变量 print(a))#打印普通全局变量if __name__ == '__main__':#调用函数 c=dcs(100)#创建对象 c.A1()#对象调用方法
class People(object): #新式类
class People: #经典类
python3当中:默认继承object类,所以不区分新式类和经典类
python2当中:没有默认继承的,需要自己去继承,所以它区分新式类和经典类
|
|