Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
引用相同位置的python类实例_Python - Fatal编程技术网

引用相同位置的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。这是我不应该担心的事,对吗?