数据类型的存储

本文探讨了Python和Java中变量的本质差异,解释了Python的引用计数垃圾回收机制以及__eq__方法在列表比较中的作用。通过实例展示了Python中局部变量和默认参数的影响,特别是列表作为默认参数可能导致的共享问题,并提醒开发者注意避免此类问题。
摘要由CSDN通过智能技术生成
python和java中的变量本质不一样,java的变量像盒子,python的变量实质是指针,类似便利贴
a = 1
b = 1
print(a is b)  # True
a_list = [1, 2, 3, 4]
b_list = [1, 2, 3, 4]
print(a is b)  # False
python内部 有个intern机制,str\int\float这些单个数据,会作为一个完整的对象
但list\dict都是会另外生成新对象
print(a_list == b_list)  # True,列表中有个魔法函数__eq__判断值是否相等

person = Person()
if type(person) is Person:
    print("yes")
python中垃圾回收的算法是采用引用计数
a = 1  # 1这个对象的计数器会加1
b = a  # 1这个对象的计数器再加1
del a
del是将计数器减1,同时取消a指针(变量a被删除),但实际上1这个对象还是存在的。C++中的del则不同,会直接将这个1对象删除
a = object()
b = a
del a
print(b)  # 会打印
print(a)  # 会报错
class A:
    # 当python回收对象时,会调用__del__魔法函数
    def __del__(self):
        pass
1、列表在函数局部空间里使用+=,是会改变列表本身的
def add(a, b):
    a += b
    # 不同数据传递,a会有不同影响,尤其列表,列表在局部空间里是会被修改的
    return a


if __name__ == "__main__":
    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)
2、列表在函数初始化时,使用默认值,会容易使多个未传递列表的对象,共用同一个列表对象,容易造成“牵一发动全身”的问题
class Company:
    def __init__(self, name, staffs=[]):  # 注意,默认的可变对象list,会成为为传递值的对象的公共数据
        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传递了list,因此不会与其他对象com2\com3共用默认列表
    com1 = Company("com1", ["bobby1", "bobby2"])
    com1.add("bobby3")
    com1.remove("bobby1")
    print(com1.staffs)  # ["bobby2","bobby3"]
    # com2和com3都没有传递list,都使用默认的staffs=[],list本身是可变对象,因此com2和com3会公用默认的staffs=[] 
    com2 = Company("com2")
    com2.add("bobby")
    print(com2.staffs)  # ["bobby"]
    com3 = Company("com3")
    com3.add("bobby5")
    print(com2.staffs)  # ["bobby","bobby5"]
    print(com3.staffs)  # ["bobby","bobby5"]
    print(com2.staffs is com3.staffs)  # True
    print(com2 is com3)  # False
    # 获取默认值,这是com2和com3未传递值时的共用默认值
    print(Company.__init__.__defaults__)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值