Python函数无法修改列表问题求助——《Python Crash Course》练习8-10
问题:修改魔术师列表的函数未生效原因及正确实现
我正在完成《Python Crash Course》(第一版)中的练习8-10《Great Magicians》。练习要求基于8-9的代码,编写make_great()函数修改魔术师列表,为每个名字添加"the Great"后缀,并调用show_magicians()验证列表已修改。
作者明确说明:将列表作为函数参数传入会修改原列表,使用list[:]则传递副本避免修改。我按照意图编写了如下代码,但调用make_great()后原magicians列表并未改变,想请教原因。
我已通过临时列表的方法解决,但认为这不符合练习设计意图,希望找到无需临时列表的正确实现方式。
magicians = ["Danton", "Professor", "Fallon", "Tesla"] def make_great(whocares): """making great""" for x in whocares: x = x + ", the Great" make_great(magicians) show_magicians(magicians) # The list magicians remained as it was: Why?
原因分析
你代码里的问题出在循环逻辑上:for x in whocares遍历列表时,x只是原列表元素的临时副本。而且Python的字符串是不可变类型,x = x + ", the Great"其实是创建了一个全新的字符串对象,根本没碰原列表里的元素,所以原列表自然不会变。
无需临时列表的正确实现
要直接修改原列表,得通过索引定位元素并替换,这样操作的是列表本身的位置,不是临时变量:
magicians = ["Danton", "Professor", "Fallon", "Tesla"] def show_magicians(mags): for mag in mags: print(mag) def make_great(whocares): """为魔术师添加the Great后缀""" for i in range(len(whocares)): whocares[i] = whocares[i] + ", the Great" make_great(magicians) show_magicians(magicians)
运行这段代码后,原magicians列表会被直接修改,符合练习要求的“修改原列表”的设计意图。
内容的提问来源于stack exchange,提问作者Derniers Outrages
相关产品推荐
相关产品推荐

