推荐学习书目
› Learn Python the Hard Way
Python Sites
› PyPI - Python Package Index
› http://diveintopython.org/toc/index.html
› Pocoo
值得关注的项目
› PyPy
› Celery
› Jinja2
› Read the Docs
› gevent
› pyenv
› virtualenv
› Stackless Python
› Beautiful Soup
› 结巴中文分词
› Green Unicorn
› Sentry
› Shovel
› Pyflakes
› pytest
Python 编程
› pep8 Checker
Styles
› PEP 8
› Google Python Style Guide
› Code Style from The Hitchhiker's Guide
crossmaya
V2EX  ›  Python

怎么总有人说python是弱类型语言呢??

  •  
  •   crossmaya · Feb 27, 2013 · 26658 views
    This topic created in 4997 days ago, the information mentioned may be changed or developed.
    python是动态脚本语言

    python is not vbscript

    我想说的就这么多.....
    42 replies  •  1970-01-01 08:00:00 +08:00
    bhuztez
    bhuztez
    Feb 27, 2013
    1
    因为他们不懂强类型弱类型和静态类型动态类型有啥区别

    其实Python大部分时候是强类型语言,有那么几个角落有那么点弱类型
    binux
    binux
    Feb 27, 2013
    2
    他们想的弱类型和你想的弱类型不一样罢了
    jybox
    jybox
    Feb 27, 2013
    3
    还有人说C是弱类型语言呢~
    C0VN
    C0VN
    Feb 27, 2013
    4
    确实应该是动态类型,而不是弱类型。
    qinix
    qinix
    Feb 27, 2013 via Android
    5
    @jybox C不就是静态弱类型语言么?
    RisingV
    RisingV
    Feb 27, 2013
    6
    @qinix 如果从这样一个角度看:都是整数和浮点数,就是长度不一样。貌似还真是成立的,哈哈
    cai314494687
    cai314494687
    Feb 28, 2013
    7
    变量不需要声明为特定的数据类型的语言就是弱语言。
    LTaoist
    LTaoist
    Feb 28, 2013❤️1
    8
    C是典型的静态类型弱类型语言。python是典型的动态类型强类型语言。

    静态类型动态类型说的是变量的类型十分可以改变。针对的是变量的类型。
    弱类型强类型值得是变量的具体的值是否是有固定的类型的,是否可以改变。

    C的变量是不可以改变类型的,所以是强类型。但是强制类型转换可以发生,一个整数可以强制解读为浮点数,等等,所以是弱类型的。python的变量可以改变类型,是动态类型的。但是其绑定的实体是不会改变类型的,即使是把dict转换为list,参与的其实是两个值的实体了,没有发生真正的类型转换。

    大部分动态类型的语言都是强类型的,只有C这种接近底层的语言才比较容易是弱类型。

    应该是这样吧?
    keakon
    keakon
    Feb 28, 2013
    9
    @cai314494687
    没有弱语言这种玩意。
    弱类型语言是指变量的类型可以被隐式转换。而 Python 不允许,所以它是强类型语言。
    这里有个例子: http://www.zhihu.com/question/20224705/answer/14394999
    haohaolee
    haohaolee
    Feb 28, 2013
    10
    没有绝对的弱与强,只有比较,才能说谁更弱谁更强
    yegle
    yegle
    Feb 28, 2013
    11
    不是说只要存在隐式类型转换的语言就是动态语言么笑…
    aisk
    aisk
    Feb 28, 2013❤️1
    12
    强/弱类型区分已经没那么明显了,说Python是强类型,但是他有的时候还是会偷偷的给你做隐式类型转换。本来这个定义就是先有语言实现,再有后来的人给划分,非要分类总是还会有争议的。


    @cai314494687 这种说法完全不正确,像Haskell或者go等等有类型推导的语言,很多情况也不需要你声明变量类型,但是变量的类型确实是在运行时前就确定的了,其实是编译器做了这部分工作。


    @LTaoist 你自己说的矛盾了啊。。。你的观点c是强类型还是弱类型?而且现在很多人认为js是弱类型的啊,这个和是否动态语言/是否接近底层没关系。
    xuc
    xuc
    Feb 28, 2013 via Android
    13
    @LTaoist 是不是笔误了?
    BOYPT
    BOYPT
    Feb 28, 2013
    14
    因为这么说的人就不知道什么叫弱类型。我接触过的语言里面只有php和javascript有弱语言特性:

    1000 == "1000"

    而且因为这种特性经常被人诟病,绝大多数情况都要写成 === 恒等。
    FrankHB
    FrankHB
    Feb 28, 2013
    15
    C是强类型的,只不过不怎么彻底。C的弱类型一面表现在有限的compatible type允许省略部分类型限制而不是随便什么转换(要说转换,反而正好说明强类型的,因为除了UB外的操作意义明确且都不会导致类型错误)。至于所谓强制(coercion)根本就不是C的概念。
    http://tieba.baidu.com/p/1398718411?pid=17001826896&cid=0#17001826896
    ooscrewyou
    ooscrewyou
    Feb 28, 2013
    16
    看了下Wikipeadia把Python歸爲強類型語言
    The object-oriented programming languages Smalltalk, Ruby, Python, and Self are all "strongly typed" in the sense that typing errors are prevented at runtime and they do little implicit type conversion, but these languages make no use of static type checking: the compiler does not check or enforce type constraint rules.
    不過strong typed是打引號的。
    Python裏面
    >>> 1 == 1.0
    True
    >>> 1 + 1.1
    2.1
    ML系的帶類型推倒的靜態語言是嚴格區分整數和浮點數的
    # 1 + 1.;;
    Error: This expression has type float but an expression was expected of type
    int
    不過樓主說Python是腳本語言是不對的,只要你願意,完全可以寫一個Python編譯器出來。沒有腳本語言的說法,只是說某個語言的實現是腳本運行的。
    crossmaya
    crossmaya
    OP
    Feb 28, 2013
    17
    膜拜大神们 学习了.
    seeker
    seeker
    Feb 28, 2013
    18
    @aisk 强弱类型的概念的确不是很确切,也难以划分,不像动态/静态。@LTaoist 应该是笔误了,c/c++弱爆了类型。
    reusFork
    reusFork
    Mar 1, 2013 via Android
    19
    类型的强弱是没有明确的边界的,所以存在两可的区域,争论这个没有多大意义
    静态类型和动态类型就有明确的区分边界
    aisk
    aisk
    Mar 1, 2013
    20
    @seeker 我觉得动态静态划分界限都越来越模糊了,比如Java现在都大量使用接口来增加代码的动态性
    Narcissu5
    Narcissu5
    Mar 1, 2013❤️1
    21
    隐式转换应该不是弱类型的标志,其实隐式转换也就是隐式调用了toString和valueOf,像C#这种可以通过重载运算符在所有类型之间实现隐式转换,难道C#是弱类型的?

    我觉得强弱类型区别在于如何解释内存,弱类型对同一片内存可以解释为不同的类型,强类型在做转换的时候总是返回一个副本。
    ruchee
    ruchee
    Mar 1, 2013
    22
    何必纠结,写起来快,运行不要太慢就OK了
    seeker
    seeker
    Mar 1, 2013
    23
    @Narcissu5 嗯,c/c++运行时并不知道int和char的区别,int/char是写给人看的,所以弱类型。
    seeker
    seeker
    Mar 1, 2013
    24
    @aisk 比如Java现在都大量使用接口来增加代码的动态性,并不是说他就动态类型了,编译好了,他的类型就确定了,所以还是静态类型的。
    有多个接口,只说明他有多种类型(多态)。
    就是因为他的静态特性,才需要接口这种东西人为的编译前给了类型信息,动态类型的话,直接duck typing了,借口可以不要声明。
    aisk
    aisk
    Mar 1, 2013❤️1
    25
    @seeker 一般观点也都这么认为的,只是像动态语言靠拢了。不过我觉得像常规认为的动态语言,比如Python,只不过是靠拢到了极致,动态/静态之间并没有**十分明确**的界限。比如Java把所有变量类型都声明为Object或者所有类型都实现一个接口,然后在运行时的时候靠反射一类的方法来做调用,这样也和动态语言差别不是很大了。
    seeker
    seeker
    Mar 1, 2013
    26
    @aisk 嗯,反射的话,是模糊了动态/静态类型的界限。
    archsocks
    archsocks
    Mar 1, 2013
    27
    @aisk
    >强/弱类型区分已经没那么明显了,
    >说Python是强类型,但是他有的时候还是会偷偷的给你做隐式类型转换。

    我还不知道python还有这功能,你举个例子让我看看?
    aisk
    aisk
    Mar 1, 2013
    28
    @archsocks

    In [1]: a=1

    In [2]: type(a)
    Out[2]: int

    In [3]: a = a + 1l

    In [4]: a
    Out[4]: 2L
    clino
    clino
    Mar 1, 2013
    29
    @aisk 对于整形长整形的操作,连c语言都是这样的吧
    aisk
    aisk
    Mar 1, 2013
    30
    @clino 是啊
    archsocks
    archsocks
    Mar 1, 2013
    31
    @aisk
    int和long,str和unicode不算,因为这二个类型是由于python 2.x的兼容性实现限制而搞出来的,其实应该是一个类型,不能以这个说明python不是强类型。而且在python3里这二个类型被修正成一个类型了。
    aisk
    aisk
    Mar 1, 2013
    32
    @archsocks python3里面float和int相加还是会做隐式类型转换啊…… 而且我也没说这个能说明python不是强类型,只是想说明强弱类型之间的界限没那么明显。
    binux
    binux
    Mar 1, 2013
    33
    @aisk

    实际上
    In [1]: a = 1

    In [2]: id(a)
    Out[2]: 140379290666840

    In [3]: a = a + 1l

    In [4]: id(a)
    Out[4]: 4513106928

    In [5]: a
    Out[5]: 2L

    我觉得这不能完全说明这里确实做了类型转换,比如我重载__add__,那任何东西和我加都会隐式转换咯
    aisk
    aisk
    Mar 1, 2013
    34
    @binux a的id会变是是另外一回事了,跟当前讨论问题无关。python里面int也是堆上分配的,并没有在栈上,为了减少频繁malloc的开销,小整数(目前版本是-5到2xx,具体忘了)会做一个全局缓存,之后a指向的对象是整型2,地址自然会改变了,可以看这里:

    In [1]: a=1

    In [2]: id(a)
    Out[2]: 137679024

    In [3]: a+=1

    In [4]: id(a)
    Out[4]: 137679012

    In [5]: b=1

    In [6]: id(b)
    Out[6]: 137679024

    In [7]: id(1)
    Out[7]: 137679024
    binux
    binux
    Mar 1, 2013
    35
    @aisk 你没注意到重点,不但id无法说明,也很难说 x+y 的时候,是x自己转换了,还是“+”把它转换了
    aisk
    aisk
    Mar 1, 2013
    36
    @binux 还是没理解……
    fansgentle
    fansgentle
    Mar 1, 2013
    37
    @cai314494687 变量不需要声明为特定的数据类型的语言是动态类型语言吧。
    binux
    binux
    Mar 1, 2013
    38
    @binux

    class A:
    def __add__(self, other):
    return 'something'

    a = A()
    a = a + 1

    那么,是a被隐式转换了呢,还是1被隐式转换了?
    Zuckonit
    Zuckonit
    Mar 1, 2013
    39
    强弱针对是否隐式转换
    gaodayue
    gaodayue
    Mar 2, 2013
    40
    我对强弱类型不太了解,不过静态/动态类型的区别还是很明显的。静态类型语言在运行前就能确定变量的类型并做类型检查(如C/C++, Java),动态类型语言则是在运行时才能知道变量的类型并作类型检查(如python, js)。一个常见的误解是把需不需要声明变量类型来区分静态/动态类型,导致这个误解的原因是他们还没有接触过像ML这类具有类型推导的语言。
    lldong
    lldong
    Mar 2, 2013
    41
    类型系统科普贴 What to know before debating type systems
    http://blogs.perl.org/users/ovid/2010/08/what-to-know-before-debating-type-systems.html
    reusFork
    reusFork
    Apr 5, 2013
    42
    @archsocks py2里的str就是py3里的bytes,py2里的unicode就是py3里的str,还是两个类型,只不过换了名字而已,并没有合并
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3408 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 84ms · UTC 10:33 · PVG 18:33 · LAX 02:33 · JFK 05:33
    ♥ Do have faith in what you're doing.