代码之家  ›  专栏  ›  技术社区  ›  Brian

python如何管理类中的变量?

  •  0
  • Brian  · 技术社区  · 3 年前

    假设我有以下两个python文件。

    foo.py

    class Foo:
        def __init__(self):
            self.my_var = 0
        
        def print_var(self):
            print(f"self.my_var: {self.my_var}")
            print(f"self.my_var address: {hex(id(self.my_var))}")
    
        def set_var(self, v):
            self.my_var = v
    

    test_foo.py

    import foo
    
    f1 = foo.Foo()
    f2 = foo.Foo()
    print(f"\n=========== first print ===========")
    f1.print_var()
    f2.print_var()
    f1.set_var(3)
    print(f"\n=========== second print ===========")
    f1.print_var()
    f2.print_var()
    

    当我奔跑时 python3 test_foo.py ,我得到以下结果:

    =========== first print ===========
    self.my_var: 0
    self.my_var address: 0x7ffb7477a180   # Why do f1's and f2's `self.my_var` refer to the same instance?
    self.my_var: 0
    self.my_var address: 0x7ffb7477a180
    
    =========== second print ===========
    self.my_var: 3
    self.my_var address: 0x7ffb7477a1e0
    self.my_var: 0
    self.my_var address: 0x7ffb7477a180
    

    我很好奇为什么在第一张照片中,f1和f2 self.my_var 请参考同一实例。 我的意思是,它们都指位于 0x7ffb7477a180 .

    我原以为他们会提到不同的例子。

    这是我的预期输出,尽管我知道这是错误的。

    =========== first print ===========
    self.my_var: 0
    self.my_var address: 0x7ffb7477a1e0
    self.my_var: 0
    self.my_var address: 0x7ffb7477a180
    
    =========== second print ===========
    self.my_var: 3
    self.my_var address: 0x7ffb7477a1e0
    self.my_var: 0
    self.my_var address: 0x7ffb7477a180
    

    python是否有任何文档解释它如何管理类中的变量?

    1 回复  |  直到 3 年前
        1
  •  1
  •   Kris    3 年前

    原因是小整数缓存。Python缓存小整数,即-5到256之间的整数。这些数字使用得如此频繁,以至于已经有了这些对象对性能更好。因此,这些整数将在启动时分配。然后,每次你引用一个对象时,你都会引用一个已经存在的对象。这就是为什么,对于有值的变量,您会看到相同的引用 0 .

    然而,CPython确实如此,我读到它与其他实现存在一些差异。请参阅此 answer 更广泛的解释