V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
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 · 2013-02-27 22:10:57 +08:00 · 25114 次点击
    这是一个创建于 4293 天前的主题,其中的信息可能已经有所发展或是发生改变。
    python是动态脚本语言

    python is not vbscript

    我想说的就这么多.....
    42 条回复    1970-01-01 08:00:00 +08:00
    bhuztez
        1
    bhuztez  
       2013-02-27 22:13:22 +08:00
    因为他们不懂强类型弱类型和静态类型动态类型有啥区别

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

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

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

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

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


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


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

    1000 == "1000"

    而且因为这种特性经常被人诟病,绝大多数情况都要写成 === 恒等。
    FrankHB
        15
    FrankHB  
       2013-02-28 13:05:20 +08:00
    C是强类型的,只不过不怎么彻底。C的弱类型一面表现在有限的compatible type允许省略部分类型限制而不是随便什么转换(要说转换,反而正好说明强类型的,因为除了UB外的操作意义明确且都不会导致类型错误)。至于所谓强制(coercion)根本就不是C的概念。
    http://tieba.baidu.com/p/1398718411?pid=17001826896&cid=0#17001826896
    ooscrewyou
        16
    ooscrewyou  
       2013-02-28 15:02:24 +08:00
    看了下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
        17
    crossmaya  
    OP
       2013-02-28 20:32:32 +08:00
    膜拜大神们 学习了.
    seeker
        18
    seeker  
       2013-02-28 23:59:53 +08:00
    @aisk 强弱类型的概念的确不是很确切,也难以划分,不像动态/静态。@LTaoist 应该是笔误了,c/c++弱爆了类型。
    reusFork
        19
    reusFork  
       2013-03-01 09:30:49 +08:00 via Android
    类型的强弱是没有明确的边界的,所以存在两可的区域,争论这个没有多大意义
    静态类型和动态类型就有明确的区分边界
    aisk
        20
    aisk  
       2013-03-01 10:12:24 +08:00
    @seeker 我觉得动态静态划分界限都越来越模糊了,比如Java现在都大量使用接口来增加代码的动态性
    Narcissu5
        21
    Narcissu5  
       2013-03-01 10:21:54 +08:00   ❤️ 1
    隐式转换应该不是弱类型的标志,其实隐式转换也就是隐式调用了toString和valueOf,像C#这种可以通过重载运算符在所有类型之间实现隐式转换,难道C#是弱类型的?

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

    我还不知道python还有这功能,你举个例子让我看看?
    aisk
        28
    aisk  
       2013-03-01 14:24:41 +08:00
    @archsocks

    In [1]: a=1

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

    In [3]: a = a + 1l

    In [4]: a
    Out[4]: 2L
    clino
        29
    clino  
       2013-03-01 14:27:45 +08:00
    @aisk 对于整形长整形的操作,连c语言都是这样的吧
    aisk
        30
    aisk  
       2013-03-01 14:38:36 +08:00
    @clino 是啊
    archsocks
        31
    archsocks  
       2013-03-01 15:25:16 +08:00
    @aisk
    int和long,str和unicode不算,因为这二个类型是由于python 2.x的兼容性实现限制而搞出来的,其实应该是一个类型,不能以这个说明python不是强类型。而且在python3里这二个类型被修正成一个类型了。
    aisk
        32
    aisk  
       2013-03-01 15:49:06 +08:00
    @archsocks python3里面float和int相加还是会做隐式类型转换啊…… 而且我也没说这个能说明python不是强类型,只是想说明强弱类型之间的界限没那么明显。
    binux
        33
    binux  
       2013-03-01 16:21:47 +08:00
    @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
        34
    aisk  
       2013-03-01 16:58:36 +08:00
    @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
        35
    binux  
       2013-03-01 17:39:08 +08:00
    @aisk 你没注意到重点,不但id无法说明,也很难说 x+y 的时候,是x自己转换了,还是“+”把它转换了
    aisk
        36
    aisk  
       2013-03-01 17:52:13 +08:00
    @binux 还是没理解……
    fansgentle
        37
    fansgentle  
       2013-03-01 20:29:52 +08:00
    @cai314494687 变量不需要声明为特定的数据类型的语言是动态类型语言吧。
    binux
        38
    binux  
       2013-03-01 21:20:24 +08:00
    @binux

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

    a = A()
    a = a + 1

    那么,是a被隐式转换了呢,还是1被隐式转换了?
    Zuckonit
        39
    Zuckonit  
       2013-03-01 21:25:55 +08:00
    强弱针对是否隐式转换
    gaodayue
        40
    gaodayue  
       2013-03-02 12:53:18 +08:00
    我对强弱类型不太了解,不过静态/动态类型的区别还是很明显的。静态类型语言在运行前就能确定变量的类型并做类型检查(如C/C++, Java),动态类型语言则是在运行时才能知道变量的类型并作类型检查(如python, js)。一个常见的误解是把需不需要声明变量类型来区分静态/动态类型,导致这个误解的原因是他们还没有接触过像ML这类具有类型推导的语言。
    lldong
        41
    lldong  
       2013-03-02 13:03:48 +08:00
    类型系统科普贴 What to know before debating type systems
    http://blogs.perl.org/users/ovid/2010/08/what-to-know-before-debating-type-systems.html
    reusFork
        42
    reusFork  
       2013-04-05 22:32:59 +08:00
    @archsocks py2里的str就是py3里的bytes,py2里的unicode就是py3里的str,还是两个类型,只不过换了名字而已,并没有合并
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1242 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 176ms · UTC 23:57 · PVG 07:57 · LAX 15:57 · JFK 18:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.