我正在读埃里克·马特思的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)发布于 2018-10-08 18:20:12
您的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发布于 2018-10-08 18:21:48
您不能这样将元素重新分配到列表中。当您在循环中重新分配magician时,所做的就是重新分配用于引用magicians中的字符串的局部变量。
使用“理解”创建一个新列表,该列表在每个字符串中都有“伟大”;您将返回:
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]]你不能用像String这样的不可变对象来做这件事,因为不可变对象本身不能以任何方式被改变。
发布于 2018-10-08 18:40:17
答案是,您的函数没有修改orIn 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))https://stackoverflow.com/questions/52707965
复制相似问题