将列表副本传递给python

时间:2016-06-22 15:25:31

标签: python list function copy

我正在尝试将列表的副本传递给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个元素,并且相同的元素是唯一移动的元素。

我做错了什么?

3 个答案:

答案 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)   

再次感谢并为此感到抱歉。