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)
对象引用参数传递经典错误
def add(a,b):
a+=b
return a
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("like",["xiapang","xiaohe","m"])
com1.add("music")
com1.remove("m")
print(com1.staffs)#['xiapang', 'xiaohe', 'music']
com2=Company("like2")
com2.add("xiaopang")
print(com2.staffs)#['xiapang', 'xiaohe', 'music']
com3=Company("like3")
com3.add("xiaohe")
print(com2.staffs)#['xiaopang', 'xiaohe']
print(com3.staffs)#['xiaopang', 'xiaohe']
print(com2.staffs is com3.staffs)#True
'''
为什么两个不同的对象com2和com3它们的staffs却
互相影响了,
1.参数数staffs是列表,是可变对象
2.因为com2和com3刚开传参的时候没有传递staffs
这个列表作为参数,所以内部会调用默认的list,
2个对象都是用的是默认的list
'''
# a=1
# b=2
# c=add(a,b)
# print(c)#3
# print(a,b)#1 2
# a=[1,2]
# b=[3,4]
# c = add(a, b)
# print(c)#[1, 2, 3, 4]
# print(a,b)#[1, 2, 3, 4] [3, 4]
#
# a=(1,2)
# b=(3,4)
# c = add(a, b)
# print(c)#(1, 2, 3, 4)
# print(a,b) #(1, 2) (3, 4)
==和is
a=[1,2,3,4]
b=[1,2,3,4]
print(a==b)#True 会调用__eq__ 来判断他们的值
print(id(a),id(b)) #167632840 167484552
print(a is b) # False
c=1
d=1
print(id©,id(d)) #1633938544 1633938544
print(c is d)#True
delete和垃圾回收的区别
#cpython2.0中垃圾回收的算法是采用 引用计数
a=object()
b=a
del a
#del并不是回收机制,它是删除了一个变量
# 的引用,并将其引用计数减1
#而垃圾回收机制则是在引用计数为0时才进行回收
print(b)
# print(a)
class A:
#当python解释器要回收的时候,它就可以执行
#__del__ 这个魔法函数里的逻辑
def __del__(self):
pass