Python是强大的动态类型。
>强类型意味着值的类型不会突然改变。只包含数字的字符串不会奇迹般地成为一个数字,这可能发生在Perl中。每个类型的更改都需要显式转换。
>动态类型意味着运行时对象(值)具有类型,而不是静态类型,其中变量具有类型。
至于你的例子
bob = 1
bob = "bob"
这是因为变量没有类型;它可以命名任何对象。在bob = 1之后,你会发现该类型(bob)返回int,但是在bob =“bob”之后,它返回str。 (请注意,type是一个常规函数,因此它会计算其参数,然后返回值的类型。)
与旧的方言C,它是弱,静态类型,使指针和整数几乎可以互换对比。 (现代ISO C在许多情况下都需要转换,但我的编译器默认情况下仍然宽松。)
我必须补充说,强对弱打字更像是一个连续体而不是布尔选择。 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,其中类型是完全不相交的,只有通过类型类可以控制形式的重载。)