我遇到过说 Python 是一种强类型语言的链接。
但是,我认为在强类型语言中你不能这样做:
bob = 1
bob = "bob"
我认为强类型语言在运行时不接受类型更改。也许我对强/弱类型的定义有误(或过于简单化)。
那么,Python 是强类型语言还是弱类型语言?
最佳答案
Python 是强动态类型的。
至于你的例子
bob = 1
bob = "bob"
这是有效的,因为变量没有类型;它可以命名任何对象。在bob=1
之后,你会发现type(bob)
返回int
,但是在bob="bob"
,它返回 str
。 (请注意,type
是一个常规函数,因此它会计算其参数,然后返回值的类型。)
将此与旧的 C 方言进行对比,后者是弱静态类型的,因此指针和整数几乎可以互换。 (现代 ISO C 在很多情况下都需要转换,但我的编译器默认对此仍然宽容。)
我必须补充一点,强类型与弱类型更像是一个连续体,而不是 bool 选择。 C++ 的类型比 C 强(需要更多的转换),但类型系统可以通过使用指针转换来颠覆。
在 Python 等动态语言中,类型系统的强度实际上取决于其原语和库函数对不同类型的响应方式。例如,+
被重载,因此它可以处理两个数字或两个字符串,但不能处理一个字符串和一个数字。这是在实现 +
时做出的设计选择,但从语言的语义来看,这并不是真正的必然。实际上,当您在自定义类型上重载 +
时,可以使其隐式地将任何内容转换为数字:
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
和 float
类型的对象并返回 float
类型的对象(例如,int(42) + float(1)
返回 43.0
)。另一方面,由于类型之间的不匹配,如果尝试以下 (42::Integer) + (1::Float)
,Haskell 会提示。这使得 Haskell 成为一种严格类型化的语言,其中类型完全不相交,并且只能通过类型类实现受控形式的重载。
https://stackoverflow.com/questions/11328920/