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
dddd
V2EX  ›  Python

求解释一下 Python 里的 None 到底代表什么?? 我简单的测试了一下,求解释……

  •  
  •   dddd · 2014-05-23 11:52:22 +08:00 · 4632 次点击
    这是一个创建于 3839 天前的主题,其中的信息可能已经有所发展或是发生改变。
    >>> b = list()
    >>> print(b is None)
    False
    >>> b = []
    >>> print(b is None)
    False
    >>> print(b == [])
    True
    >>> b = list()
    >>> print(b == [])
    True
    >>> print(b == None)
    False
    18 条回复    2014-05-23 19:17:39 +08:00
    woshifyz
        1
    woshifyz  
       2014-05-23 12:00:43 +08:00
    list() == []
    [] != None
    jiang42
        2
    jiang42  
       2014-05-23 12:04:38 +08:00
    我是理解成 C 里面的 null 指针的
    manfay
        3
    manfay  
       2014-05-23 12:05:47 +08:00
    这个问题更加像是 == 与 is 的区别吧。
    在Python里,== 是值相等,is是对象相等,对象相当于一个内存区块。所以如果两者在内存里储存在不同的地方,is的测试结果就为False。
    (我只是初学者,有可能理解得不对……)
    sandtears
        4
    sandtears  
       2014-05-23 13:38:24 +08:00   ❤️ 1
    None 就代表一个什么都没有的东西,类型是 NoneType, 而 "[]" 代表一个空的列表,它的类型是 list
    VYSE
        5
    VYSE  
       2014-05-23 14:20:51 +08:00
    b = list()
    print id(b)

    print id([])
    print id(None)
    你就知道了is是干啥的了

    print id(1)
    print id(1.0)
    所以1 is not 1.0
    但1==1.0
    minbaby
        6
    minbaby  
       2014-05-23 14:43:02 +08:00
    print type([])
    print type(None)
    manfay
        7
    manfay  
       2014-05-23 14:53:39 +08:00
    @sandtears 即使类型相同,两个空列表的is测试也可能为False。

    a = list()
    b = list()
    print(a is b)

    结果为False
    tongle
        8
    tongle  
       2014-05-23 15:49:57 +08:00
    None is just None
    type(None)
    <type 'NoneType'>
    walleL
        9
    walleL  
       2014-05-23 16:36:51 +08:00   ❤️ 1
    None 是一个特殊 Python 对象, 在 Python 解释器启动时自动创建, 解释器退出时销毁
    在一个解释器进程中只有一个 None 存在, 因为不可能有其他对象会使用 None 已占用的内存(它就是占了个坑)
    所以只有: None is None and None == None
    tonghuashuai
        10
    tonghuashuai  
       2014-05-23 17:29:39 +08:00   ❤️ 2
    用指针来说
    is: 指向同一内存地址
    ==: 指向的内存地址中的内容是相同的

    a = list()
    b = []
    print a == b # True
    print a is b # False

    c = "abc"
    d = "abc"
    print c == d # True 字符串池
    print c is d # True

    此时为 list() 和 [] 相当于各自分配了一次内存,所以 a is not b,
    但是 各自分配的内存中的内容是一样的,故而 a == b。

    c 和 d 指向同一个内存地址(字符串池、引用计数机等机制)所以 c is d,
    c 和 d 指向的内存中存的内容也是相同的("abc"),所以 c == d


    而 None,可以认为是内存中不同于其他的一块内存空间,a b c d 都有各自的指向,所以不是指向 None,故而 a b c d is not None,自然 a b c d != None

    一图胜千言

    dorentus
        11
    dorentus  
       2014-05-23 17:41:32 +08:00 via iPhone
    不考虑实现细节,只看隐喻的话,None 顾名思义就是没有;为啥会觉得空列表和没有/不存在是等价的?
    hitsmaxft
        12
    hitsmaxft  
       2014-05-23 18:00:59 +08:00
    nobody => None

    One => Interger(1)

    EmptyList => List()

    isFalse => False(1)

    isTrue => True(1)

    所以他们不等
    sandtears
        13
    sandtears  
       2014-05-23 18:50:56 +08:00
    @manfay "is" 并非比较值,而是比较是否为同一个对象。。

    就像你有两个水杯,一个水杯 A 一个水杯 B,两个里面都是空的。

    你可以说这两个水杯相等(也就是 "=="),但不能说他们是同一个水杯(也就是 "is")
    zog
        14
    zog  
       2014-05-23 19:02:20 +08:00
    @manfay id(a),id(b),你会发现他们指向对象不是同一个,所以is会False
    zog
        15
    zog  
       2014-05-23 19:03:52 +08:00
    is为true时候是他们id同样,公用同一指针~
    zog
        16
    zog  
       2014-05-23 19:06:07 +08:00
    推荐阅读: https://docs.python.org/3.3/reference/datamodel.html 仔细阅读一下数据模型。搞清楚引用,对象,对象值之间的关系,搞清楚引用赋值,浅拷贝,深拷贝,这三者的差异。
    yakczh
        17
    yakczh  
       2014-05-23 19:09:09 +08:00
    None相当于js的undefined
    jsonline
        18
    jsonline  
       2014-05-23 19:17:39 +08:00 via Android
    is 和 equal 是不同的,亲
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1985 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 16:18 · PVG 00:18 · LAX 08:18 · JFK 11:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.