强弱定义有学术上的,如果按照题主提到的含义"是否存在隐式转换”来看待的话,其实py和C还是有差别的,不过这个差别得去实现层面去看了,具体说就是,类型的转换是语言本身决定的,还是类型自己决定的
譬如说,支持int和float的混合运算,C就是语言本身决定的,编译器看到你用int和float做加法,就根据规定把int转float,然后做float的加法,这是一种弱类型特性
但是py中并不是这样的,py是动态类型语言,编译器看到a+b,并不知道a和b是什么类型,其实也不需要知道,因为只有运行时才知道它们是什么类型(严格说,是它们"引用的对象”是什么类型,因为py的变量是无所谓类型的),语言上的规定很宽松,就一句话:a+b等同于a.__add__(b),也就是说加法运算是对象的一个方法,由对象自己决定(实际情况稍复杂一点,也可以等同于b.__radd__(a),即正向走不通走反向),所以并不是"隐式类型转换”,而是"a类型能支持以b的类型为参数的加法方法”;而像not转bool,其实也是调用方法,任何对象转bool都是由其本身定义的方法决定,只不过过程更复杂,会先看有没有__nonzero__方法,如果没有就看有没有__len__……,总之是类型自己决定行为的,当然内建类型的行为,语言规范也会定义到,但依然是runtime实现而非编译器介入
所以上面说C有"弱类型特性”,弱类型是一种特性,一个语言也可以同时存在强弱两种特性,用这个判断语言本身其实只是一种大略的说法了,《编译原理》一书甚至有一节论述中认为java也是动态类型语言呢,因为所有对象都可以用Object引用