引用相同位置的python类实例
我有一个名为引用相同位置的python类实例,python,Python,我有一个名为Door的类和一个名为Window的类。它是名为Furniture的类的子类。我的程序读取excel文件,在上面循环两次,第一次读取/写入关于门的所有信息,第二次读取/写入关于windows的所有信息。简而言之,我有以下代码: for gathering_inf in ('door', 'window'): for row in file: if gathering_inf == 'door' and currently reading door line:
Door
的类和一个名为Window
的类。它是名为Furniture
的类的子类。我的程序读取excel文件,在上面循环两次,第一次读取/写入关于门的所有信息,第二次读取/写入关于windows的所有信息。简而言之,我有以下代码:
for gathering_inf in ('door', 'window'):
for row in file:
if gathering_inf == 'door' and currently reading door line:
furniture = Door(width, height, description)
if gatherig_inf == 'window' and currently reading window line:
furniture = Window(width, height, description)
# Now do something with the furniture object ..
奇怪的是,如果我(如上图所示)打印对象家具
,我会得到它们的位置,并且,一些对象在内存中的位置是相同的,即使它们是两个不同的实例和不同的属性。例如:
<__main__.Door object at 0x03BFE810>
<__main__.Door object at 0x03BFE890>
<__main__.Door object at 0x03BFE810>
<__main__.Door object at 0x03BFE890>
<__main__.Door object at 0x03BFE8B0>
<__main__.Door object at 0x03BFE8D0>
<__main__.Door object at 0x03BFE8B0>
<__main__.Window object at 0x03BFE8D0>
<__main__.Window object at 0x03BFE8B0>
<__main__.Window object at 0x03BFE890>
<__main__.Window object at 0x03BFE8B0>
<__main__.Window object at 0x03BFE890>
<__main__.Window object at 0x03BFE8B0>
<__main__.Window object at 0x03BFE890>
<__main__.Window object at 0x03BFE8B0>
<__main__.Window object at 0x03BFE890>
有人能给我解释一下python为什么会这样做吗 这是因为引用计数垃圾收集器。一旦一个新对象被分配给
furniture
,GC将删除该对象,因此新对象可以重新使用其内存位置
下面是一个演示这种行为的小演示。请注意,由于Python REPL的工作方式(它保留了对
\uu
中最后一个结果的引用),地址将交替
>>> foo = object(); foo
<object object at 0x7fd74cd390a0>
>>> foo = object(); foo
<object object at 0x7fd74cd390b0>
>>> foo = object(); foo
<object object at 0x7fd74cd390a0>
>>> foo = object(); foo
<object object at 0x7fd74cd390b0>
>>> foo = object(); foo
<object object at 0x7fd74cd390a0>
>foo=object();福
>>>foo=object();福
>>>foo=object();福
>>>foo=object();福
>>>foo=object();福
非常明确:这是Python虚拟机的工作方式
您所观察到的是引用计数垃圾收集器的CPython实现的细节CPython在您的例子中是垃圾收集Door
对象,然后创建一个新的Window
对象,然后重用(现在已垃圾收集)Door对象的位置,将Window
对象存储在那里
事实上,CPython重用以前被垃圾收集的对象的地址是很常见的。例如,在我的计算机上运行ThiefMaster的代码,我得到的结果略有不同(旋转):
在这一点上,需要注意的是,这种行为是特定于CPython的。例如,似乎不会产生类似的结果,但我不知道这种不一致性是否与实现差异有关:
在您的第二个if子句中,您是在检查变量集合吗?是的,这是一个输入错误。我正在相应地编辑我的帖子。谢谢你们的回答。我担心我的代码中有一个bug或者别的什么:d。这是我不应该担心的事,对吗?