一尘不染

Python是强类型的吗?

python

我遇到过一些链接,说Python是一种强类型的语言。

但是,我认为在强类型语言中你不能这样做:

bob = 1
bob = "bob"

我认为强类型语言在运行时不接受类型更改。也许我对强类型/弱类型的定义有误(或过于简单)。

那么,Python是强类型语言还是弱类型语言?


阅读 371

收藏
2020-02-21

共1个答案

一尘不染

Python是强大的动态类型。

  • 强类型意味着值的类型不会以意外的方式改变。仅包含数字的字符串不会神奇地变成数字,就像Perl中可能发生的那样。类型的每次更改都需要显式转换。
    动态类型意味着运行时对象(值)具有类型,而静态类型则是变量具有类型。
    至于你的例子
bob = 1
bob = "bob"

这是可行的,因为变量没有类型;它可以命名任何对象。之后bob=1,你会发现type(bob)返回int,但是之后bob="bob",它将返回str。(请注意,这type是一个常规函数,因此它将计算其参数,然后返回值的类型。)

与此相比,C的早期方言是弱类型的,静态类型的,因此指针和整数几乎可以互换。(现代ISO C在许多情况下都需要转换,但是默认情况下,我的编译器对此仍然宽容。)

我必须补充一点,强类型vs.弱类型键入更多是一个连续的过程,而不是布尔选择。C ++具有比C强的类型(需要更多的转换),但是可以使用指针强制转换来破坏类型系统。

诸如Python之类的动态语言中类型系统的优势实际上取决于其原语和库函数如何响应不同类型。例如,+已重载,因此它可以处理两个数字或两个字符串,但不能处理一个字符串和一个数字。这是在+实施时做出的设计选择,但从语言的语义来看并不是真正的必要。实际上,当你+在自定义类型上重载时,可以使其隐式将任何内容转换为数字:

def to_number(x):
    """Try to convert x to a number."""
    if x is None:
        return 0
    # more special cases here
    else:
        return float(x)  # works for numbers and strings

class Foo(object):
    def __add__(self, other):
        other = to_number(other)
        # now do the addition

(我知道的唯一完全强类型(也称为严格类型)的语言是Haskell,其中类型完全不相交,并且只能通过类型类控制重载。

2020-02-21