找回密码
 立即注册

推荐阅读

  • 便民服务
  • 关注我们
  • 社区新手
深拷贝和浅拷贝(面试常问)
深拷贝 :拷贝出来的新对象和原对象是不一样的,内存地址也不一致,原对象怎么进行改变都不会影响当前对象
浅拷贝 :对象不一样,但是对象里面的可变元素的地址相同
#深拷贝  修改拷贝后的对象中的数据不影响原对象内容
深拷贝
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当中:没有默认继承的,需要自己去继承,所以它区分新式类和经典类

分享至 : QQ空间
收藏

1 个回复

倒序浏览
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册