Python嵌套元组遍历提示变量过多报错原因咨询
错误原因
你的代码有三个核心问题,直接触发解包报错的是遍历逻辑错误:
- 遍历对象写错了:
albums本身是存储单张专辑信息的3元素元组,三个成员分别是歌手名字符串、年份字符串、歌曲列表。你直接写for artist,year,songs in albums时,第一次迭代取到的是第一个元素——长度为15的字符串"Backstreet Boys",Python会尝试把这个字符串按迭代顺序(逐个字符)拆成3个变量赋值,字符数量远大于3,自然抛出「解包值过多(预期3个)」的报错,也就是你说的变量数量过多提示。 - 单元素元组语法错误:你写的
("No place")不是元组,Python规定单元素元组必须在元素后加逗号,否则括号仅作为运算优先级标识,这里实际存储的就是普通字符串,不是嵌套元组结构。 - 格式化传参错误:
format()方法外多套了一层括号,你把artist,year,songs三个值打包成了1个三元组传入,但字符串里有3个占位符,就算解包逻辑过了,这里也会报参数数量不匹配的错误。
修正代码
如果只是处理这单张专辑的信息,根本不需要循环,直接解包即可:
albums = ("Backstreet Boys", "1991", # 如果不需要特意做单元素元组,歌曲直接存字符串就行,不用额外套括号 ["No place", "Backstreet's Back", "Everybody"]) artist, year, songs = albums print("Artist: {}\nYear:{}\nSongs: {}".format(artist, year, songs))
如果你是想做多个专辑的遍历测试嵌套结构,需要把albums改成存储多张专辑的可迭代对象,每个元素是单张专辑的三元组,写法参考:
# 外层是专辑列表,每个元素是(歌手,年份,歌曲列表)结构 albums = [ ("Backstreet Boys", "1991", ["No place", "Backstreet's Back", "Everybody"]), ("Westlife", "1999", ["Swear It Again", "If I Let You Go"]) ] for artist, year, songs in albums: print("Artist: {}\nYear:{}\nSongs: {}\n---".format(artist, year, songs))
注意点
- 做循环解包时,一定要确认遍历的每一个元素的结构,和你等号左边要赋值的变量数量、顺序完全匹配。
- 单元素元组的尾部逗号是固定语法,漏写就不会生成元组类型,写嵌套结构时要特别注意。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

