结论:python是一种动态的强类型语言。
人们常常把动静类型和强弱类型混淆,在这之前我也没分清,不需要定义函数或变量的类型说明这是一个动态语言,而强弱分类则是依据对于隐式类型转化的检查严格程度来评判的。

以JavaScript为例:

JS不需要实现确定函数或者变量的类型,它会自动确定变量所属的类型,这就是一种动态语言,然而JS变量之间的隐式类型转化非常复杂和过分,比如,Javascript 中123 + null 结果为 123,123 + {}结果为字符串“123[object Object]”。
另外,它的双等号“==”除了有基本的比较操作,还可能发生多重的隐式类型转换,例如true==['2'] 判断出的结果为 false,而true==['1'] 的结果是 true,还有[]==![][undefined]==false 的结果都为 true…… 虽然JS后来有提供三等号同时检查值和数据类型,但数据类型的隐式转化还是存在的。布尔类型,整型,字符串等都可以互相转化,不够严格,这就是一种“弱检查类型”的语言,也是弱类型语言。

以Java为例:

java需要提前约定数据的类型,这样编译器在执行前就知道变量的类型和方法应该返回的类型,这就是一种静态语言,而java对于类型转化有非常严格的定义,基本都是通过各种方法调用来严格的转化类型,这就是一种“强检查类型”的语言。也是强类型语言。

以Python为例:

我们可以分析几种典型的用法。
比如,"test"*3 这种字符串“乘法”运算,虽然是两种类型的操作,但是并不涉及隐式类型转换转化。
比如,x=10; x="test" 先后给一个变量不同类型的赋值,表面上看 x 的类型变化了,用 type(x) 可以判断出不同,但是,Python 中的类型是跟值绑定的(右值绑定),并不是跟变量绑定的。
变量 x 准确地说只是变量名,是绑定到实际变量上的一个标签,它没有类型。type(x) 判断出的并不是 x 本身的类型,而是 x 指向的对象的类型,就像内置函数 id(x) 算出的也不是 x 本身的地址,而是实际的对象的地址。
比如,1 + True 这种数字与布尔类型的加法运算,也没有发生隐式类型转换。因为 Python 中的布尔类型其实是整型的子类,是同一种类型!(如果有疑问,可查阅 PEP-285
再比如,整数/布尔值与浮点数相加,在 Python 中也不需要作显式类型转换。但是,它的实现过程其实是用了数字的__add__() 方法,Python 中一切皆对象,数字对象也有自己的方法。(其它语言可不一定)
也就是说,数字间的算术运算操作,其实是一个函数调用的过程,跟其它语言中的算术运算有着本质的区别。
另外,不同的数字类型虽然在计算机存储层面有很大差异,但在人类眼中,它们是同一种类型(宽泛地分),所以就算发生了隐式类型转换,在逻辑上也是可以接受的。
最后,还有一个例子,即 Python 在 if/while 之后的真值判断,我之前分析过它的实现原理 ,它会把其它类型的对象转化成布尔类型的值。
但是,它实际上也只是函数调用的结果(bool() 和 len()),是通过计算而得出的合理结果,并不属于隐式的强制类型转换,不在 untrapped errors 的范畴里。
所以,严格来说,前面 5 个例子中都没有发生类型转换。 浮点数和真值判断的例子,直观上看是发生了类型转换,但它们其实是 Python 的特性,是可控的、符合预期的、并没有对原有类型造成破坏。
退一步讲,若放宽“隐式类型转换”的含义,认为后两个例子发生了隐式类型转换,但是,它们是通过严谨的函数调用过程实现的,也不会出现 forbidden errors,所以还是属于强检查类型。

语言类型分类图

6.编程语言的分类-强弱类型与动静类型 - 图1
以下文章有详细说明: