标签:class 内容 name app 区别 可变 使用 垃圾 init
为什么b也变了呢,由于a,b同时指向同一个地址,导致a指向的内容改变也会让b改变,id()获得对象所指向的内存中的地址,如果是对象本身的地址的话a,b应该是不相同的。
1 a = [1, 2, 3] 2 b = a 3 # a和b实质是指针都指向同一个地址,修改a同时会修改b 4 print(id(a), id(b)) # 54866344 54866344 5 print(a is b) # True 6 7 a.append(2) 8 print(a, b) # [1, 2, 3, 2] [1, 2, 3, 2]
a和b指向不同的对象,c和a指向相同对象
1 a = [1, 2, 3, 4] 2 b = [1, 2, 3, 4] 3 c = a 4 print(id(a), id(b), id(c)) # 19333544 19333480 19333544
关键点:
对于小整数和小串字符建立都指向同一个地址,其他都是不同地址
1 a = 1 2 b = 1 3 c = a 4 print(id(a), id(b), id(c)) # 1399769008 1399769008 1399769008 5 6 a = "abc" 7 b = "abc" 8 c = a 9 print(id(a), id(b), id(c)) # 24048032 24048032 24048032
1 a = [1, 2, 3, 4] 2 b = [1, 2, 3, 4] 3 c = a 4 print(id(a), id(b), id(c)) # 19333544 19333480 19333544 5 print(a is b, a is c, b is c) # False True False 6 print(a == b, a == c, b == c) # True True True
先建立a,让b,c同时指向a所指向的内存此时引用计数值为3,del a之后引用计数为2,最后程序结束删除对象
1 class A: 2 def __init__(self, name): 3 self.name = name 4 print("init:" + name) 5 6 def __del__(self): 7 print("del:" + self.name) 8 9 10 a = A("a") # init:a 11 b = a 12 c = a 13 del a 14 c.name = "c" 15 print(b.name) # c 16 b.name = "b" 17 print(b.name) # b
最后执行del:b
4.一个经典错误
标签:class 内容 name app 区别 可变 使用 垃圾 init
原文地址:https://www.cnblogs.com/zhihaospace/p/12089255.html