0

好的,所以我有这个代码:

earth = makeWorld()

def turtle():
  list = ['Bill', 'Fred']
  for name in list:
    print name
    name = makeTurtle(earth)

我想要做的是遍历列表,所以我为列表中的每个名称制作一个海龟。这显然是错误的,因为海龟只在 name.forward() 上移动并且在列表中使用 'name' 而不是 'Bill' 或 'Fred'。所以它使用的是名称而不是列表名称。但我不知道如何纠正这个问题?

4

3 回答 3

2

除了打印之外,您没有使用name它。然后,您将in 的值替换name为任何makeTurtle(earth)返回值。

从某些上下文来看,它看起来像是makeTurtle()为您创建了一个海龟对象

turtle = makeTurtle(earth)

然后你可以用turtle这个名字做一些事情,但你需要turtle在循环体内使用。

或者,创建一个字典来将名称连接到海龟:

turtles = {name: makeTurtle(earth) for name in yourlist}

现在您有了从名称到海龟对象的映射。

于 2013-05-20T23:21:14.923 回答
1

最好的解决方案是使用字典来保存您的名称-对象对:

earth = makeWorld()
names = ['Bill', 'Fred']

turtles = {} # empty dictionary
for name in names:
    turtles[name] = makeTurtle(earth)

现在您可以使用turtles字典来访问任何命名对象:

turtles['Bill'].do_something()

您还可以使用“dict理解”构造字典,而不是将其创建为空并在显式循环中添加海龟:

turtles = { name: makeTurtle(earth) for name in names }

顺便说一句,用作变量的名称是一个坏主意list,因为这会影响内置列表类型。虽然您通常可以在一个简短的函数中摆脱它,但如果您在模块的顶层执行它可能会导致非常混乱的错误。

于 2013-05-20T23:27:31.727 回答
0

您可以使用列表推导来列出您的新 turles。

def turtle_generator(names):
    for name in names:
        yield (name, makeTurtle(earth))

def turtle_list(names):
    return [(name, makeTurtle(earth)) for name in names]


for (name, turtle) in turtle_xxx(['Bill', 'Fred']):
    print name
    print turtle

这将为每个名称创建一个新的海龟,但看起来您并没有以任何方式使用该名称,因此您可能会重新考虑如何定义 makeTutle

于 2013-05-20T23:53:41.653 回答