Python中使用变量作为列表索引的可行性及实现方案咨询
问题解答
你完全可以将a作为索引变量来使用,但你当前的写法存在索引越界风险,同时也有可优化的冗余逻辑。
现有代码问题
你初始化a = 1,每次匹配成功后a自增1,当a的值等于drumsound列表的长度时,drumsound[a]会超出列表的最大索引范围(Python列表索引从0开始,最大有效索引为len(列表)-1),会直接抛出索引越界报错。同时你已经写了for x in drumsound遍历列表,不需要额外维护索引变量来取值。
推荐实现方式
1. 直接用遍历得到的元素值(最简洁)
你已经通过for x in drumsound拿到了列表里的每个元素,直接判断x的值即可,不需要单独做索引取值:
def beat(): for x in drumsound: if x == "1": mixer.music.load("soundfiles/snare.mp3") mixer.music.set_volume(1) mixer.music.play() elif x == "2": mixer.music.load("soundfiles/tom.mp3") mixer.music.set_volume(1) mixer.music.play()
2. 需要用到索引时用enumerate函数
如果你确实需要同时拿到元素的位置索引和元素值,可以用Python内置的enumerate()方法,自动处理索引不会越界:
def beat(): # index为元素对应的索引,x为元素本身 for index, x in enumerate(drumsound): if x == "1": mixer.music.load("soundfiles/snare.mp3") mixer.music.set_volume(1) mixer.music.play() elif x == "2": mixer.music.load("soundfiles/tom.mp3") mixer.music.set_volume(1) mixer.music.play()
3. 坚持手动维护索引变量的修正写法
如果你要保留手动控制索引a的写法,需要修改初始化值和循环逻辑,避免越界:
def beat(): a = 0 # 索引从0开始,否则会漏掉列表第一个元素 while a < len(drumsound): # 循环条件限制索引不超过列表最大有效值 if drumsound[a] == "1": mixer.music.load("soundfiles/snare.mp3") mixer.music.set_volume(1) mixer.music.play() elif drumsound[a] == "2": mixer.music.load("soundfiles/tom.mp3") mixer.music.set_volume(1) mixer.music.play() a += 1
内容的提问来源于stack exchange,提问作者Joseph Murphy
相关产品推荐
相关产品推荐

