设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 14256|回复: 5
打印 上一主题 下一主题

关于函数中修改列表

[复制链接]

12

主题

0

好友

126

积分

注册会员

Rank: 2

跳转到指定楼层
楼主
发表于 2018-1-6 18:00:49 |只看该作者 |倒序浏览
题目是这样的,创建两个函数: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的?我试了也报错。。。

回复

使用道具 举报

12

主题

0

好友

126

积分

注册会员

Rank: 2

沙发
发表于 2018-1-6 18:14:34 |只看该作者
追问问题二:
在删除原列表元素,再添加新的(加了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)
回复

使用道具 举报

6

主题

2

好友

654

积分

实习版主

Rank: 7Rank: 7Rank: 7

板凳
发表于 2018-1-6 20:35:04 |只看该作者
第一个问题 magicians[:]是取magicians内所有元素的,最开始for magician in magicians[:],已经把magicians里的三个元素取出来了,也就相当于for magician in ['liuqian','derek.zhao','dylan']了,元素是不会随着magicians列表的变化而增多的
而for magician in magicians,因为循环中不断往magicians这个列表中添加元素,magicians元素不断增多,导致无限跳不出for循环了
回复

使用道具 举报

6

主题

2

好友

654

积分

实习版主

Rank: 7Rank: 7Rank: 7

地板
发表于 2018-1-6 20:55:30 |只看该作者
变色幽灵 发表于 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弄了三次
回复

使用道具 举报

6

主题

2

好友

654

积分

实习版主

Rank: 7Rank: 7Rank: 7

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

修改的话,把magicians.append(new_magician)删掉,或者新建个列表new_magicians[],把new_magician加到新列表里,不影响magicians列表就好了
回复

使用道具 举报

12

主题

0

好友

126

积分

注册会员

Rank: 2

6#
发表于 2018-1-7 06:10:18 |只看该作者
TED 发表于 2018-1-6 20:35
第一个问题 magicians[:]是取magicians内所有元素的,最开始for magician in magicians[:],已经把magician ...

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

谢谢lz
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-23 15:48 , Processed in 0.025054 second(s), 24 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部