Python中max(List, key=List.get)为何能正确返回结果?
max(字典, key=字典.get)写法的运行原理解释 首先明确:你代码里命名为List的变量实际是字典类型,不是列表,这是后续逻辑的基础。
核心逻辑拆解
- 先讲
max()的key参数规则:Python内置max()函数的第一个参数接收可迭代对象,key参数需要传入一个可调用对象(函数、方法都算)。遍历可迭代对象时,max()会把当前遍历到的元素传入这个可调用对象,用返回值作为大小比较的权重,最终返回权重最高的原始元素,不是权重本身。 - 再讲字典的默认遍历行为:直接遍历字典时,默认迭代产出的内容是字典的所有键,不会直接遍历值或者键值对。对你的示例字典来说,遍历拿到的元素依次是
'7'、'8'、'6'三个字符串键。 - 最后讲
List.get的本质:这是字典绑定的实例方法,作用是接收一个键作为入参,返回该键对应的字典值,键不存在时默认返回None。注意这里写List.get没有加括号,不是当场执行方法拿返回值,而是把方法本身作为可调用对象传给了key参数。
对应你示例的实际执行流程
你写的代码运行时的步骤,和下面手写的逻辑完全等价:
char_count = {'7':3, '8':50, '6': 2} max_char = None max_count = -1 # 遍历字典的所有键 for char in char_count: # 等价于key函数的调用:拿当前键去取对应的频次 current_count = char_count.get(char) if current_count > max_count: max_count = current_count max_char = char # 最终max_char就是'8',和max(char_count, key=char_count.get)返回结果一致
常见误区说明
很多初学者会误写为List.get()——加括号代表立刻调用这个方法,而get方法本身要求传入要查询的键作为参数,直接无参调用会直接抛出类型错误。不加括号时只是传递方法引用,max()内部遍历到每个键的时候,会自动把当前键作为参数传给get方法完成取值。
这个写法和写max(List, key=lambda k: List[k])效果完全一致,只是直接传内置的get方法更简洁,不需要额外定义匿名函数。
内容的提问来源于stack exchange,提问作者Zhe Hin Yap
相关产品推荐
相关产品推荐

