美文网首页
对象引用,可变性和垃圾回收

对象引用,可变性和垃圾回收

作者: sixkery | 来源:发表于2018-11-11 15:13 被阅读10次

    python中的变量到底是什么

    思维导图

    python的变量实质是一个指针

    • 事先没有预定大小,可以是任意类型,比如 int、str
    • 可以理解成一个便利贴,可以贴在任何类型上
    
    a = 1
    a = 'asd'
    

    可以理解成一个便利贴,a 贴在 1 上。

    注意:

    • 是先生成对象,然后再贴

    • 不需要声明类型

    看一个例子

    a = [1,2,3]
    b = a
    b.append(4)
    print(a)
    
    输出:[1, 2, 3, 4]
    

    结论: a 和 b 贴在了同一个地方。

    判断一下 a 和 b 是不是同一个对象

    a = [1,2,3]
    b = [1,2,3]
    print(a is b)
    
    输出:True
    

    判断一下 a 和 b 是不是同一个对象(内存地址)

    a = [1,2,3]
    b = [1,2,3]
    print(id(a),id(b))
    
    输出:8533576 8533576
    

    == 和 is 的区别

    • is 是判断两个变量引用对象id是否相等
    • == 用于判断引用变量的值是否相等

    整数

    a = 123456789
    b = 123456789
    print(a is b)
    print(a == b)
    
    # 结果:True True
    

    字符串

    a = '123456789'
    b = '123456789'
    print(a is b)
    print(a == b)
    
    # 结果:True True
    

    列表

    a = [1,2,3]
    b = [1,2,3]
    print(a is b)
    print(a == b)
    
    # 结果:False True
    

    字典

    a = {'name':'sixkery'}
    b = {'name':'sixkery'}
    print(a is b)
    print(a == b)
    
    # 结果:False True
    

    集合

    a = (1,2)
    b = (1,2)
    print(a is b)
    print(a == b)
    
    # 结果:False True
    

    总结

    只要是对象的值一样,那么 a == b 的值一定为True

    如果对象的类型为整数或者字符串且值一样,则 a == b 和 a is b 的值都为 True (负浮点数不符合)

    a = -1.0
    b = -1.0
    print(a is b)
    print(a == b)
    
    # 结果:False True
    

    del语句和垃圾回收

    python中垃圾回收的算法是:引用计数

    a = 1 # 1 的计数器上加一
    b = a # 1 的计数器上再加一
    
    del a # 计数器减一
    
    print(b)
    print(a)
    # 结果:
    1
    Traceback (most recent call last):
       File "e:/python/test.py", line 8, in <module>
        print(a)
     NameError: name 'a' is not defined
    

    当计数器加为零的时候,python就会把 1 回收,不占用内存。

    相关文章

      网友评论

          本文标题:对象引用,可变性和垃圾回收

          本文链接:https://www.haomeiwen.com/subject/blwxfqtx.html