簡體   English   中英

python如何管理class內部的變量?

[英]How does python manage variables inside a class?

假設我有以下兩個 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的變量。

我預計他們會提到不同的實例。

這是我預期的 output,但我知道這是錯誤的。

=========== 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 是否有任何文檔解釋它如何管理 class 中的變量?

原因是小 Integer 緩存。 Python 緩存小整數,它們是介於 -5 和 256 之間的整數。這些數字使用得如此頻繁,因此讓這些對象可用對性能更好。 所以這些整數將在啟動時分配。 然后,每次您引用一個時,您將引用一個已經存在的 object。 這就是原因,您會看到對值為0的變量的相同引用。

然而,這對 CPython 來說是正確的,我讀到它與其他實現有一些差異。 請參閱此答案以獲得更廣泛的解釋

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM