我正在尝试将列表的副本传递给python中的函数,这样我就可以弹出并附加到新列表而不会丢失旧列表中的信息。但我遇到了麻烦。
这是我的代码
def show_magicians(magicians):
for magician in magicians:
print (magician.title())
return magicians
def make_great(magicians):
for magician in magicians:
new_magician = magicians.pop()
new_magicians.append(new_magician)
print (new_magician.title() + ", is a great magician!!")
return magicians
new_magicians = []
magicians = ['merlin', 'blaine', 'agaybi', 'copperfield']
show_magicians(magicians)
make_great(magicians[:])
print ('\n' , magicians)
print ('\n' , new_magicians)
第二个函数应该将元素从旧列表移动到新列表,并为每个元素打印简单语句而不清空旧列表。问题是我只打印了1个元素,并且相同的元素是唯一移动的元素。
我做错了什么?
答案 0 :(得分:2)
您在第一位魔术师处理后返回
更改make_great函数,如下所示
def make_great(magicians):
for magician in magicians:
new_magician = magicians.pop()
new_magicians.append(new_magician)
print (new_magician.title() + ", is a great magician!!")
return magicians
答案 1 :(得分:1)
existing answer解决了您的直接问题,但您的代码仍然存在不必要的混淆,我认为这会让您陷入困境。
"正确" 这样做的方法是避免在magicians
内改变make_great
。采用这样的可变参数的Python函数应 改变其参数并返回None
或创建一个新对象并返回该对象。它当然不应该(至少这么简单的任务)改变它的参数和在封闭范围中的对象和返回第二个对象。
例如,你可以做到:
def make_great(magicians):
"""Make each magician in the input great."""
new_magicians = [] # create a brand new list
for name in magicians: # iterate over old list
new_magicians.append(name + ' is a great magician!') # add to new list
return new_magicians # note this is outside the for loop
然后,您不需要在函数外部创建new_magicians
,或者将原始magicians
的副本传递给它:
magicians = ['merlin', 'blaine', 'agaybi', 'copperfield']
new_magicians = make_great(magicians)
print(magicians) # still the same
print(new_magicians) # brand new list
答案 2 :(得分:0)
好的,首先非常感谢你们。我终于找到了问题以及如何解决它。我正在进行的练习特别要求我使用[:]制作列表的浅表副本并通过函数传递它以通过弹出创建新列表。
问题是我在函数内部保留了打印语句的for
循环,而不是将其放在外部是全局的。
这是新的正确代码:
def show_magicians(magicians):
for magician in magicians:
print (magician.title())
def make_great(magicians):
while magicians:
new_magician = magicians.pop()
new_magicians.append(new_magician)
new_magicians = []
magicians = ['merlin', 'blaine', 'agaybi', 'copperfield']
show_magicians(magicians)
make_great(magicians[:])
for magician in magicians:
print ('\n' + magician.title() + " is a great magician!!")
print ('\n')
print (magicians)
print ('\n')
print (new_magicians)
再次感谢并为此感到抱歉。