无法正确更改列表中的项目

时间:2019-01-24 19:46:08

标签: python

所以我正在做一个相当简单的任务。 我有魔术师的名单:

magicians_1 = ["Merlin","Harry Potter","Sabrina"]

show_magicians函数的目的是仅打印出魔术师的姓名:

def show_magicians(magicians):
    for magician in magicians:
        print(magician)

但是我的目标是编写一个函数,通过在名称的末尾添加“ Great”来更改魔术师的名称:

def make_great(magicians):
   for magician in magicians:
       magician = magician.replace(magician, magician + " the Great")
   return(magician)

这是我想出的。但是,如果我使用清单magicians_1调用make_great wit函数,然后使用magicians_1调用show_magicians(),名称将保持不变。

如果我在make_great()中使用print()魔术师而不是将其返回,它将打印出正确的名称。但这不是功能的目标。我想永久更改名称。

所以我的问题是,如何通过调用show_magicians来更改打印出正确结果的名称?

4 个答案:

答案 0 :(得分:1)

这是因为您正在使用for ... in循环。这意味着magician是该项目在magicians[i]的副本。要修改数组中的项目,您需要使用索引来引用原始数组。

def make_great(magicians):
   for i in range(len(magicians)):
       magicians[i] = magicians[i] + " the Great"
   return(magician)

答案 1 :(得分:0)

您只是在重新绑定循环变量。您实际上必须重新绑定列表索引。例如:

def make_great(magicians):
    for i, magician in enumerate(magicians):
        magicians[i] = magician + " the Great"

除了虚假的return语句外,您的代码与以下代码大致相同,从而使其更加显而易见:

for i in range(len(magicians)):
    magician = magicians[i]
    magician = something  # why would magicians[i] be affected by this line?

答案 2 :(得分:0)

您在这里遇到了几个问题:

  1. 在for循环中有一个返回值,这意味着该函数将返回第一个值
  2. 您通过的列表不会更改,因为您没有更改其值。
  3. 我认为您不需要在这里替换,您可以遍历列表项并为每个项添加“出色”,尽管我找不到这样做的理由。只需拥有:for i in range(len(magicians)): magicians[i] = magicians[i] + ' the Great'

答案 3 :(得分:0)

其他人已经回答了您原来的解决方案不起作用的原因。这是一个可行的解决方案的另一个示例,该解决方案使用列表理解。

def make_great(magicians):
    magicians = [r + ' the Great' for r in magicians]
    return magicians