我在Python上比较新,使用2.7。这似乎应该有效,但事实并非如此。
我想用多个Player类实例创建一个类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个Player实例,分配给p1,p2和p3。这似乎是最简单的方法:
def initPlayers(self):
self.getPlayerList()
for i in self.playerlist:
i = Player(i) # doesn't work
return
此代码通过Player实例化循环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")
我无法弄清楚为什么这不起作用,也不知道我应该怎么做,谢谢。
答案 0 :(得分:3)
我认为你过于复杂了。试图动态生成变量名称通常是一个坏主意;改为使用字典:
players = {i:Player(i) for i in self.playerlist}
或者,甚至更简单的一个列表,您可以通过索引访问玩家:
players = [Player(i) for i in self.playerlist]
您在当前循环中所做的只是将新的Player
对象分配给for
循环变量i
,然后在循环迭代时立即将其丢弃。
答案 1 :(得分:1)
打印有点棘手,因为它可以隐藏以相同方式打印的不同类型对象之间的差异。
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)]
然后例如代替p1.draw()
您使用self.players[0].draw()
并获得极其重要的优势,您也可以简单地说self.players[i].draw()
来访问通用i
- 播放器