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
.
的变量
我预计他们会引用不同的实例。
这是我的预期输出,虽然我知道这是错误的。
=========== 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 中的变量?
原因是小整数缓存。 Python 缓存小整数,它们是介于 -5 和 256 之间的整数。这些数字使用得如此频繁,因此最好让这些对象可用以提高性能。所以这些整数将在启动时分配。然后,每次您引用一个对象时,您将引用一个已经存在的对象。这就是原因,您会看到具有值 0
.
的变量的相同引用
然而,这对 CPython 来说是正确的,我读到它与其他实现有一些差异。请参阅此 answer 以获得更广泛的解释
假设我有以下两个 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 是否有任何文档解释它如何管理 class 中的变量?
原因是小整数缓存。 Python 缓存小整数,它们是介于 -5 和 256 之间的整数。这些数字使用得如此频繁,因此最好让这些对象可用以提高性能。所以这些整数将在启动时分配。然后,每次您引用一个对象时,您将引用一个已经存在的对象。这就是原因,您会看到具有值 0
.
然而,这对 CPython 来说是正确的,我读到它与其他实现有一些差异。请参阅此 answer 以获得更广泛的解释