一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情。
1、问题:下图的代码执行结果会是什么?
此时执行结果为"b和c的值相等 b和c的id地址相等" 这两个判断条件都满足,所以两个都打印了。 分析:因为a为一个元组,是一个不可变元组,所以拷贝的是相应的id地址,如果a为可变对象,例如字典,列表,此时拷贝的就是值,id的地址就不一致了。
总结:可变对象浅拷贝和深拷贝拷贝的值相当,但是id地址不相等, 不可变对象浅拷贝和深拷贝拷贝的值相当,id的地址也相等。
可变对象:列表和字典。
不可变对象:一旦创建就不可修改的对象,元组,字符串,数字等
备注:如果不可变对象中包含可变对象时,此时打印结果也只有值相等。
2、类变量,实例变量,类对象和实例对象的区别
2.1类变量
类变量指的是类中,但是在个各类方法外定义的变量
eg:
class Person:
name = "张三"
age = 18
def eat(self):
print("人会吃东西")
上边程序中,name和age都属于类变量,类变量的特点是,所有类的实例化对象都同时共享类变量,类变量在所有实例化对象中是作为公用资源存在的。
类变量的调用方式有2中,一种是用类名直接调用,另一种使用类的实例化对象调用。
使用类名直接调用:
print(Person.name)
print(Person.age)
修改类变量的值:
Person.name="李四"
Person.age=20
print(Person.name)
print(Person.age)
此时在查看类变量的值,发现已经更改了,由此可见,通过类名不仅可以调用类变量,而且可以修改它的值。
使用类对象来调用所属类中的类变量:
class Person:
name = "张三"
age = 18
def eat(self):
print("人会吃东西")
p = Person()
print(p.name)
print(p.age)
此时打印结果为”张三“和18,
修改类变量的值:
class Person:
name = "张三"
age = 18
def eat(self):
print("人会吃东西")
p = Person()
p.name="王五"
p.age=21
print(p.name)
print(p.age)
此时通过类的实例化对象调用变量去修改类变量的值。
可以通过动态地位类和对象添加类变量。
eg:
class Person:
name = "张三"
age = 18
def eat(self):
print("人会吃东西")
Person.sex="女"
p1 = Person()
print(p1.sex)
此时打印结果为“女”,为类添加了一个sex的变量
2.2实例变量
实例变量指的是在任意类方法内部,以”self.变量名“的方式定义的变量,只作用调用方法的对象。实例变量只能通过对象名访问,无法通过类名访问。
eg:
class Person:
def __init__(self):
self.name = "张三"
self.age = 18
def eat(self):
self.add = "中国”
print("人会吃东西")
在上边代码中,name和age都是实例变量,其中,由于__init__()函数在创建类对象时会自动调用,而eat()方法需要类对象手动调用。因此,Person类的类对象都会包含name和age实例变量,而只有调用eat()方法的类对象,才包含add的实例变量。
类对象可以访问类变量,但是无法修改类变量的值。这是因为通过类对象次该类变量的值,不是在给“类变量赋值”,而是定义新的实例变量。
eg:
class Person:
def __init__(self):
self.name = "张三"
self.age = 18
def eat(self):
print("人会吃东西")
p1 = Person()
p2 = Person()
print(p1.name)
print(p1.age)
p1.name="李四"
print(p1.name)
print(p2.name)
2.3 类对象
类对象是将具有相似属性和方法的对象总结抽象为类对象,可以定义相似的一些属性和方法,不同的实例对象去引用类对象的属性和方法,能减少代码的重复率。
eg:
class Person:
name = "张三"
age = 18
def eat(self):
print("人会吃东西")
上边代码中Person就代表类对象
2.4实例对象
实例对象又称实例化对象,不是抽象而是一类对象中具体的一例对象。
eg:
class Person:
name = "张三"
age = 18
def eat(self):
print("人会吃东西")
p1 = Person()
上边代码中p1为一个实例对象。