Python 是强动态类型的。
-
Strong键入意味着值的类型不会以意外的方式更改。仅包含数字的字符串不会像 Perl 中那样神奇地变成数字。每次类型更改都需要显式转换。
-
Dynamic类型化意味着运行时对象(值)具有类型,这与变量具有类型的静态类型相反。
至于你的例子
bob = 1
bob = "bob"
这是可行的,因为变量没有类型;它可以命名任何对象。后bob=1
,你会发现type(bob)
回报int
, 但是之后bob="bob"
,它返回str
。 (注意type
是一个常规函数,因此它计算其参数,然后返回值的类型。)
将此与较旧的 C 方言进行对比,后者是弱静态类型,因此指针和整数几乎可以互换。 (现代 ISO C 在很多情况下都需要转换,但我的编译器默认对此仍然很宽松。)
我必须补充一点,强类型与弱类型更多的是一个连续体,而不是布尔选择。 C++ 的类型比 C 更强(需要更多转换),但可以通过使用指针强制转换来破坏类型系统。
Python 等动态语言中类型系统的强度实际上取决于其原语和库函数如何响应不同类型。例如。,+
已重载,因此它适用于两个数字or两个字符串,但不是字符串和数字。这是一个设计选择+
已实现,但实际上并不是语言语义所必需的。事实上,当你超载时+
在自定义类型上,您可以将其隐式转换为数字:
def to_number(x):
"""Try to convert function argument to float-type object."""
try:
return float(x)
except (TypeError, ValueError):
return 0
class Foo:
def __init__(self, number):
self.number = number
def __add__(self, other):
return self.number + to_number(other)
类的实例Foo
可以添加到其他对象:
>>> a = Foo(42)
>>> a + "1"
43.0
>>> a + Foo
42
>>> a + 1
43.0
>>> a + None
42
请注意,即使强类型 Python 完全可以添加类型对象int
and float
并返回一个类型的对象float
(e.g., int(42) + float(1)
回报43.0
)。另一方面,由于类型之间的不匹配,如果尝试以下操作,Haskell 会抱怨(42 :: Integer) + (1 :: Float)
。这使得 Haskell 成为一种严格类型化的语言,其中类型是完全不相交的,并且只能通过类型类进行受控形式的重载。