python - Python 是强类型的吗?

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

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

bob = 1
bob = "bob"

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

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

最佳答案

Python 是强动态类型的。

  • 类型意味着值的类型不会以意想不到的方式改变。只包含数字的字符串不会像在 Perl 中那样神奇地变成数字。每次更改类型都需要显式转换。
  • 动态类型意味着运行时对象(值)具有类型,而静态类型中变量具有类型。

至于你的例子

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 完全可以添加 intfloat 类型的对象并返回 float 类型的对象(例如,int(42) + float(1) 返回 43.0)。另一方面,由于类型之间的不匹配,如果尝试以下 (42::Integer) + (1::Float),Haskell 会提示。这使得 Haskell 成为一种严格类型化的语言,其中类型完全不相交,并且只能通过类型类实现受控形式的重载。

https://stackoverflow.com/questions/11328920/

相关文章:

linux - 使用sudo时如何保留环境变量

linux - 如何使用自定义分隔符将多行文件名合并为一个?

linux - 如何递归查找并列出具有子目录和时间的目录中的最新修改文件

python - Django:显示选择值

linux - Bash 忽略特定命令的错误

python - 从 Numpy 数组 : How do I specify the index c

python - 在 Python 中获取临时目录的跨平台方法

python - 如何逐行读取大型文本文件,而不将它们加载到内存中?

linux - 更改 crontab 文件后重新启动 cron?

python - 如何检查变量是否是类?