动态语言、静态语言
强类型、弱类型

我们都知道Python是动态类型语言,但是对于Python是强类型还是弱类型,一直争议很大

动态类型及静态类型

  • 动态类型语言:在运行时动态地推断变量的类型,而不需要在编写代码时进行明确的类型声明。在这种语言中,变量的类型会根据赋给它的值来自动确定。常见的动态类型语言包括 Python、Ruby、JavaScript 等。这种类型的语言通常更加灵活,编写代码的效率也更高,但是运行时可能会出现一些类型错误,需要通过测试和调试来保证代码的正确性
# python举例
def func(a):  # 并不知道参数和返回值的类型,只有到运行时调用函数,才最终确定参数和返回值的类型
    print(type(a))
    a = {'a': 1}
    return a

if __name__ == '__main__':
    func(1)
    func('12')
    func([1, 2, 3])
    print(func((1, 2, 3, 4)))
  • 静态类型语言:在编译期间对变量的类型进行检查的编程语言。在静态类型语言中,变量一旦被声明,其类型就不能被改变,程序中所有的变量都需要指定其类型。在代码编译时,编译器会检查变量类型是否匹配,如果类型不匹配,编译器会报错。这种类型检查的机制可以帮助程序员在开发过程中尽早地发现并解决类型相关的错误,从而提高代码的可靠性和稳定性。常见的静态类型语言包括C、C++、Java等
# java举例
public class MyClass {
  public static void main(String[] args) {
    int myNum = "Hello";  // Error: Type mismatch: cannot convert from String to int
    System.out.println(myNum);
  }
}

强类型和弱类型

对于“强弱类型”的区分,它的核心问题是“不同类型的变量是否允许隐式转化”

  • 编译器有很少(合理)隐式类型转化的是强类型语言,有较多(过分)隐式类型转化的是弱类型语言
  • Python社区的主流看法认为它是强类型语言,而判断的标准则是隐式类型转换
  • 强弱类型的概念中包含着部分相对主义的含义,强类型语言中也可能有隐式类型转换
  1. 是str和int相乘?
print("test"*3)

其实是字符串“乘法”__mul__运算,虽然是两种类型的操作,但是并不涉及隐式类型转换转化

  1. 给一个变量不同类型的赋值?
x = 10
x = 'test`

表面上看 x 的类型变化了,用 type(x) 可以判断出不同,但是,Python 中的类型是跟值绑定的(右值绑定),并不是跟变量绑定的。变量 x 准确地说只是变量名,是绑定到实际变量上的一个标签,它没有类型。type(x) 判断出的并不是 x 本身的类型,而是 x 指向的对象的类型,就像内置函数 id(x) 算出的也不是 x 本身的地址,而是实际的对象的地址

  1. 数字与布尔类型相加?
1 + True

并未发生隐式类型转换。因为 Python 中的布尔类型其实是整型的子类,是同一种类型,可参考PEP 285 – Adding a bool type
整数/布尔值与浮点数相加,在 Python 中也不需要作显式类型转换。但是,它的实现过程其实是用了数字的__add__() 方法

  1. if/while 之后的真值判断,把其它类型的对象转化成布尔类型的值
import random

a = random.randint(-1, 0)
print(a)
if a:
    print('random num is not 0')

实际上也只是函数调用的结果(__bool__()__len__()),是通过计算而得出的合理结果,并不属于隐式的强制类型转换

参考及扩展阅读