我正在阅读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)
答案 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))