我在Python上相对较新,使用2.7。这似乎应该有效,但事实并非如此。
我想创建一个具有多个类播放器实例的类游戏实例。用户实例化 Game,指定玩家数量,例如,game = Game(3)。我想调用播放器实例 p1、p2 等。
我从一个创建名称列表的方法开始
def getPlayerList(self):
self.playerlist = []
for p in range (self.numplayers):
self.playerlist.append("p" + str(p+1))
return self.playerlist
对于 3 个玩家,这将生成一个包含 3 个字符串的列表:
self.playerlist = [p1, p2, p3]
现在我想创建 3 个播放器实例,分配给 p1、p2 和 p3。这似乎是最简单的方法:
def initPlayers(self):
self.getPlayerList()
for i in self.playerlist:
i = Player(i) # doesn't work
return
此代码通过播放器实例化循环 3 次,但"i"不会替换为字符串 p1、p2 和 p3。 所以,例如
p1.name
未定义。
就此而言,也是如此
i.name
如果我用这个 for 循环测试其他代码,它会与预期的替换一起使用。例如:
for i in self.playerlist:
print i
p1
p2
p3
但
i = Player(i)
不会变成实例化
p1 = Player("p1")
我不知道为什么这不起作用,也不知道我应该怎么做,谢谢。
我认为你把这复杂化了。尝试动态生成变量名称通常是一个坏主意;请改用字典:
players = {i:Player(i) for i in self.playerlist}
或者,更简单的列表,您可以在其中按索引访问玩家:
players = [Player(i) for i in self.playerlist]
你在当前循环中所做的只是将一个新的Player
对象分配给for
循环变量i
,然后在循环迭代时立即丢弃该对象。
打印有点棘手,因为它可以隐藏以相同方式打印的不同类型的对象之间的差异。
self.playerlist
的内容不是p1
、p2
和p3
,而是"p1"
、"p2"
和"p3"
。换句话说,您的列表包含三个字符串。
你真的会期待吗
i = "p1"
i = 2
将 2 分配给新变量p1
或仅将新值2
分配给变量i
?
在运行时创建"新变量"在Python中是可能的(例如使用globals()[i]=2
),但很少需要。仅使用字典或列表而不是使用变量是一个更好的选择:
self.players = [Player(i) for i in range(3)]
然后例如,您不使用self.players[0].draw()
而不是p1.draw()
,您将获得极其重要的优势,您也可以简单地说self.players[i].draw()
访问通用i
-th播放器。