为啥列表没有复制上
运行结果如下:
下面是运行成功的程序和结果图
问题根源:
在内存中magicians这个是一个地址。
make_great函数中magicians.pop时已经把原地址中magicians变为一个空列表。
后面再magicians=changed_magicians[:]时,这个magicians和刚开始的时候已经不是一个地址,可以在make_great函数中的开始和结尾使用id(magicians)来进行查看他们的地址,看下面的代码
def make_great(magicians):
changed_magicians = []
print("原始地址 >>> ", id(magicians))
while magicians:
current_magician = "the Great " + magicians.pop()
changed_magicians.append(current_magician)
magicians = changed_magicians[:]
print("变更后地址 >>> ", id(magicians))
所以两次show函数使用的是地址1的list,而make函数第一次拿到的变量 magicians指向的是地址1的list,然后你使用了pop方法,
相当于把地址1这个list变量给清空了。你第二步在函数创建将变量magicians指向你新建的一个list,这个list的地址和地址1的list不是一个。
所以造成你的问题。
解决方法是在make函数中不要使用pop,而是使用替换的方式:
def make_great(magicians):
changed_magicians = []
print("原始地址 >>> ", id(magicians))
for idx, magician in enumerate(magicians) :
current_magician = "the Great " + magician
magicians[idx] = current_magician
print("变更后地址 >>> ", id(magicians))
如果不知道enumerate函数的作用就百度搜一下。