尝试在Python中修改列表

时间:2018-10-08 18:15:39

标签: python

我正在阅读Eric Matthes撰写的 Python速成课程一书,并且正在从事此练习:

  

8-9。魔术师:列出魔术师的姓名。将清单传递给   函数show_magicians(),它打印每个函数的名称   名单上的魔术师。

     

8-10。伟大的魔术师:从副本开始   您的练习8-9中的程序。编写一个名为make_great()的函数   通过添加短语“伟大的”来修改魔术师列表   每个魔术师的名字。致电show_magicians()以查看列表   实际上已被修改。

在他的书中,他通过将列表作为函数中的参数传递来修改列表,该函数会更改列表,但我得到的只是一个原始名称的列表。 我做错了什么?

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


def make_great(magicians):
    for magician in magicians:
        magician = "Great " + magician



magicians = ['hermione','mihai','harry potter', 'voldemort']

make_great(magicians)
show_magicians(magicians)

3 个答案:

答案 0 :(得分:4)

您不能像这样将元素重新分配到列表中。当您在循环中重新分配magician时,所有要做的就是重新分配使用来引用magicians中的字符串的局部变量。

使用一种理解方法来创建一个新列表,该列表的每个字符串前均带有“ Great”;您返回的内容:

def make_great(magicians):
  return ["Great " + magician for magician in magicians] 

magicians = ['hermione','mihai','harry potter', 'voldemort']

# Returned a new list to use
great_magicians = make_great(magicians)
print(great_magicians) # ['Great hermione', 'Great mihai', 'Great harry potter', 'Great voldemort'] 

可以更改传递给函数的列表:

def f(my_list):
  my_list[0] = 2

l = [1, 2, 3]
f(l)
print(l) # [2, 2, 3]

并且您可以在迭代时更改列表中的对象:

def f(my_list):
  for l in my_list:
    l.append(9)

l = [[], []]
f(l)
print(l) # [[9], [9]]

您不能对不可变对象(例如字符串)执行此操作,因为不可变对象本身无法以任何方式进行更改。

答案 1 :(得分:3)

您的make_great函数对列表没有任何作用。

def make_great(magicians):
    for magician in magicians:
        magician = "Great " + magician

它具有一个局部变量,您可以对其进行多次更改,但是您永远不会更改列表。相反:

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

输出:

Great Hermione
Great Mihai
Great Harry Potter
Great Voldemort

答案 2 :(得分:0)

回答,您的函数未修改,或者在Python 3.6+中,您可以使用f格式简化函数

magicians = ['hermione','mihai','harry potter', 'voldemort']

def make_great(magicians):
    return [f'Great {i.title()}' for i in magicians]


print(make_great(magicians))