Python元音计数程序输出异常:变量更新正确但打印结果错误
问题根源:不可变类型的绑定陷阱
嘿,这问题我太熟了!你踩了Python里**不可变类型(比如整数)**的绑定坑啦。
咱们来拆解一下你代码里的关键问题:
你一开始写的这行:
vowelCounts = [aCount, eCount, iCount, oCount, uCount] = (0,0,0,0,0)
看起来是把几个变量都初始化为0,同时vowelCounts也关联上了这些变量,但实际上,Python的整数是不可变对象——当你执行aCount +=1的时候,并不是修改原来那个0的值,而是创建了一个新的整数(比如1、2),然后把aCount这个变量重新绑定到这个新对象上。但vowelCounts呢?它还是绑定最开始的那个全是0的元组,根本没跟着更新!
所以到最后打印的时候,你遍历的是最初的元组,自然全是0;而你在Shell里直接输aCount,拿到的是这个变量最新绑定的数值,所以是对的。
两种修复方案
方案1:用可变的列表存计数
既然元组不可变,咱们换成列表就行,列表的元素是可以修改的:
vowels = ['a', 'e', 'i', 'o', 'u'] vowelCounts = [0, 0, 0, 0, 0] # 用列表替代元组 wordlist = ['big', 'cats', 'like', 'really'] for word in wordlist: for letter in word: if letter == 'a': vowelCounts[0] += 1 elif letter == 'e': vowelCounts[1] += 1 elif letter == 'i': vowelCounts[2] += 1 elif letter == 'o': vowelCounts[3] += 1 elif letter == 'u': vowelCounts[4] += 1 for vowel, count in zip(vowels, vowelCounts): print('"{0}" occurs {1} times.'.format(vowel, count))
方案2:用字典更直观(推荐)
用字典直接把元音和计数对应起来,逻辑更清晰,还不用记索引:
vowel_counts = {'a': 0, 'e': 0, 'i': 0, 'o': 0, 'u': 0} wordlist = ['big', 'cats', 'like', 'really'] for word in wordlist: for letter in word: if letter in vowel_counts: vowel_counts[letter] += 1 for vowel, count in vowel_counts.items(): print('"{0}" occurs {1} times.'.format(vowel, count))
这两种方案跑出来的结果都会是正确的:
"a" occurs 2 times. "e" occurs 2 times. "i" occurs 2 times. "o" occurs 0 times. "u" occurs 0 times.
内容的提问来源于stack exchange,提问作者Jim421616
相关产品推荐
相关产品推荐

