Crossin的编程教室

标题: 关于函数中修改列表 [打印本页]

作者: 变色幽灵    时间: 2018-1-6 18:00
标题: 关于函数中修改列表
题目是这样的,创建两个函数:show_magicians和make_great,分别用于展示魔术师列表和在每个魔术师名称前面加上great。
列表magicians包含三个姓名
在for循环中到底使用for magician in magicians:还是使用for magician in magicians[:]:
    上图: WX20180106-175531@2x.png
    为什么在print 的时候可以使用for magician in magicians:,而在增加great的时候,就不能这样写,会无限循环,非要使用for magician in magicians[:]:
    能不能用while magicians的?我试了也报错。。。


作者: 变色幽灵    时间: 2018-1-6 18:14
追问问题二:
在删除原列表元素,再添加新的(加了great的时候),以下写法只会导致最后一个元素被不断添加great,而前面的其实没有执行,要怎么修改呢?
# encoding: utf-8
def show_magicians(magicians):
        for magician in magicians:
                print magician.title()

def make_great(magicians):
        for magician in magicians:
                current_magician = magicians.pop()
                new_magician = 'great ' + current_magician
                print new_magician
                magicians.append(new_magician)

magicians = ['liuqian','derek.zhao','dylan']


make_great(magicians)
print '\n'
show_magicians(magicians)
作者: TED    时间: 2018-1-6 20:35
第一个问题 magicians[:]是取magicians内所有元素的,最开始for magician in magicians[:],已经把magicians里的三个元素取出来了,也就相当于for magician in ['liuqian','derek.zhao','dylan']了,元素是不会随着magicians列表的变化而增多的
而for magician in magicians,因为循环中不断往magicians这个列表中添加元素,magicians元素不断增多,导致无限跳不出for循环了

作者: TED    时间: 2018-1-6 20:55
变色幽灵 发表于 2018-1-6 18:14
追问问题二:
在删除原列表元素,再添加新的(加了great的时候),以下写法只会导致最后一个元素被不断添加 ...

问题二,虽然用到了for magician in magicians[:]:但for循环内的内容并没有用到magician,也就是说这个for语句实际上代表magician='liuqian',magician='derek.zhao',和magician='dylan'三种情况,每种情况下,都用pop()提取出magicians最后一项,把这项拿出来加上'great'再加回magicians列表,三种情况每次都是提取出最后一项加内容再放回去,导致print就把最后个dylan加great弄了三次
作者: TED    时间: 2018-1-6 20:58
变色幽灵 发表于 2018-1-6 18:14
追问问题二:
在删除原列表元素,再添加新的(加了great的时候),以下写法只会导致最后一个元素被不断添加 ...

修改的话,把magicians.append(new_magician)删掉,或者新建个列表new_magicians[],把new_magician加到新列表里,不影响magicians列表就好了
作者: 变色幽灵    时间: 2018-1-7 06:10
TED 发表于 2018-1-6 20:35
第一个问题 magicians[:]是取magicians内所有元素的,最开始for magician in magicians[:],已经把magician ...

明白了~
[:]其实意味着取出了原来列表中的所有元素
而直接取这个列表名称是指这个不断变化的列表,所有用列表名的时候,一旦用了append就一直无限循环下去了

谢谢lz




欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5