7-1 python中的变量是什么
#python和java中的变量本质不一样,python的变量实质上是一个指针 int str, 便利贴
a = 1
a = "abc"
#1. a贴在1上面
#2. 先生成对象 然后贴便利贴
a = [1,2,3]
b = a
print (id(a), id(b))
print (a is b)
# b.append(4)
# print (a)
a = [1,2,3,4]
b = [1,2,3,4]
class People:
pass
person = People()
if type(person) is People:
print ("yes")
# print(a == b)
# print (id(a), id(b))
# print (a is b)
7-2 ==和is的区别
is 判断id ,==判断值
a=b,这样其实是同一个对象,分别对a,b赋值,则a,b是不同对象。不过对某些小数据,即使赋值,他们也可以为同一ID
比如a=1,b=1
代码见上节
7-3 del语句和垃圾回收
cpython中垃圾回收的算法是采用 引用计数
#cpython中垃圾回收的算法是采用 引用计数
a = object()
b = a
del a
print(b)
print(a)
class A:
def __del__(self):
pass
7-4 一个经典的参数错误
如果函数传递进去的参数是list,那么内部是可能被修改的(如果需要传递list作为参数,那么实例化时尽量不要使用默认的,不然如果还有一个实例被实例化时也使用了这个这个默认的参数,那么两个实例就可能互相影响)
def add(a, b):
a += b
return a
# a = 1
# b = 2
# a = (1, 2)
# b = (3, 4)
#列表会受到局部影响
# a = [1,2]
# b = [3,4]
# c = add(a, b)
# print(a, b)
# print(c)
class Company:
def __init__(self, name, staffs=[]):
self.name = name
self.staffs = staffs
def add(self, staff_name):
self.staffs.append(staff_name)
def remove(self, staff_name):
self.staffs.remove(staff_name)
if __name__ == "__main__":
com1 = Company("com1", ["bobby1", "bobby2"])
com1.add("bobby3")
com1.remove("bobby1")
print (com1.staffs)
com2 = Company("com2")
com2.add("bobby")
print(com2.staffs)
print(Company.__init__.__defaults__)
com3 = Company("com3")
com3.add("bobby5")
print(com2.staffs)
print(com3.staffs)
print(com2.staffs is com3.staffs)
#com2和com3实例化时都使用了默认的参数,所以会互相改变
# com1实例化时,传递进了自己的参数,所以没受到影响
目录