Python 区分类的实例

Python 区分类的实例,python,Python,我对Python完全陌生。遵循本指南: 我有一个简单的问题:当所有的怪物都在这里创建时,python如何区分类的每个实例?据我所知,所有的实例都被命名为“怪物” def放置_对象(房间): #选择任意数量的怪物 num\u monsters=libtcod.random\u get\u int(0,0,MAX\u ROOM\u monsters) 对于范围内的i(num_怪物): #为这个怪物选择随机点 x=libtcod.random\u get\u int(0,room.x1,room.x2

我对Python完全陌生。遵循本指南:

我有一个简单的问题:当所有的怪物都在这里创建时,python如何区分类的每个实例?据我所知,所有的实例都被命名为“怪物”

def放置_对象(房间):
#选择任意数量的怪物
num\u monsters=libtcod.random\u get\u int(0,0,MAX\u ROOM\u monsters)
对于范围内的i(num_怪物):
#为这个怪物选择随机点
x=libtcod.random\u get\u int(0,room.x1,room.x2)
y=libtcod.random\u get\u int(0,room.y1,room.y2)
#仅在瓷砖未被阻挡的情况下放置
如果未被阻止(x,y):
如果libtcod.random_获得_int(0,0,100)<80:#获得兽人的几率为80%
#创造一个兽人
战斗机组件=战斗机(hp=10,防御=0,力量=3,死亡功能=怪物死亡)
ai_组件=基本组件()
怪物=对象(x,y,'o','orc',libtcod.desaturated_green,
blocks=True,fighter=fighter\u组件,ai=ai\u组件)
其他:
#创造一个巨魔
战斗机组件=战斗机(hp=16,防御=1,力量=4,死亡功能=怪物死亡)
ai_组件=基本组件()
怪物=物体(x,y,'T,'troll',libtcod.深绿色,
blocks=True,fighter=fighter\u组件,ai=ai\u组件)
objects.append(怪物)

每个对象存储在不同的内存位置。这就是你区别对待的方式

使用内置函数id()

文件还说

CPython实现细节:这是中对象的地址 记忆

例如:

>>> class Foo:
...     pass
... 
>>> x = Foo()
>>> y = Foo()
>>> id (x)
17385736
>>> id (y)
20391336
>>> 

每个对象存储在不同的内存位置。这就是你区别对待的方式

使用内置函数id()

文件还说

CPython实现细节:这是中对象的地址 记忆

例如:

>>> class Foo:
...     pass
... 
>>> x = Foo()
>>> y = Foo()
>>> id (x)
17385736
>>> id (y)
20391336
>>> 

创建类的不同相同实例会生成具有不同ID的不同对象

>>> class A(object):
...   pass
... 
>>> 
>>> x = A()
>>> y = A()
>>> z = A()
>>> x
<__main__.A object at 0x10049dbd0>
>>> y
<__main__.A object at 0x10049db90>
>>> z
<__main__.A object at 0x10049dc10>
>>> x == y
False
>>> 

创建类的不同相同实例会生成具有不同ID的不同对象

>>> class A(object):
...   pass
... 
>>> 
>>> x = A()
>>> y = A()
>>> z = A()
>>> x
<__main__.A object at 0x10049dbd0>
>>> y
<__main__.A object at 0x10049db90>
>>> z
<__main__.A object at 0x10049dc10>
>>> x == y
False
>>> 
Python(CPython)使用引用计数来跟踪对象

此行创建一个对象并将其绑定到一个名称

foo = MyObject()
该对象现在由一个实体(
foo
name)引用,因此其引用计数为
1

创建新引用时,计数将增加。删除引用时,计数将减少

baz = foo
这创建了一个新的引用,因此现在它是
2

现在假设所有这些都在一个函数中:

def test():
    foo = MyObject()
    baz = foo
函数执行完毕后,将删除其所有局部变量。这意味着它们停止引用对象,计数下降。在这种情况下,计数将达到
0
,并且
MyObject
实例将从内存中释放

要使对象保持活动状态,必须保留对它们的引用。如果没有引用,则对象本身很可能已不存在。

这就是为什么您的代码将所有怪物收集到一个名为
对象
对象.附加(怪物)
)的列表中。列表将增加它包含的每个对象的计数,因此当您将名称“monster”重新绑定到另一个实例时,不会删除以前的实例

你唯一缺少的是:

objects = []
在功能开始时,以及:

return objects
最后。

Python(CPython)使用引用计数来跟踪对象

此行创建一个对象并将其绑定到一个名称

foo = MyObject()
该对象现在由一个实体(
foo
name)引用,因此其引用计数为
1

创建新引用时,计数将增加。删除引用时,计数将减少

baz = foo
这创建了一个新的引用,因此现在它是
2

现在假设所有这些都在一个函数中:

def test():
    foo = MyObject()
    baz = foo
函数执行完毕后,将删除其所有局部变量。这意味着它们停止引用对象,计数下降。在这种情况下,计数将达到
0
,并且
MyObject
实例将从内存中释放

要使对象保持活动状态,必须保留对它们的引用。如果没有引用,则对象本身很可能已不存在。

这就是为什么您的代码将所有怪物收集到一个名为
对象
对象.附加(怪物)
)的列表中。列表将增加它包含的每个对象的计数,因此当您将名称“monster”重新绑定到另一个实例时,不会删除以前的实例

你唯一缺少的是:

objects = []
在功能开始时,以及:

return objects

最后。

python中没有变量,只有名称(引用):它们类似于附加到其值的标记(请查看)。

所以当你这样做的时候:

monster = Object(x, y, 'T', 'troll')
objects.append(monster)
您只需将名称“monster”附加到
对象('troll')
的实例上,然后执行以下操作:

monster = Object(x, y, 'T', 'troll')
objects.append(monster)
您正在将标记
对象[0]
附加到该实例

这意味着,当您再次执行循环时,标记“monster”被移动到另一个实例上,例如
Object('orc')
,您不会丢失
Object('troll')
,因为至少有一个标记附加到它:
objects[0]

因此,您实际上不需要跟踪每个实例,只需要调用正确的标记


我希望这有助于您消除对python如何工作的一些疑虑。

python中没有变量,只有名称(引用):它们就像附加在其值上的标记(请查看)。

所以当你这样做的时候:

monster = Object(x, y, 'T', 'troll')
objects.append(monster)
您只需将名称“monster”附加到
对象('troll')
的实例上,然后执行以下操作:

monster = Object(x, y, 'T', 'troll')
objects.append(monster)
您正在将标记
对象[0]
附加到该实例

这意味着,当您再次执行