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

2014-05-23 11:52:22 +08:00
 dddd
>>> 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
4626 次点击
所在节点    Python
18 条回复
woshifyz
2014-05-23 12:00:43 +08:00
list() == []
[] != None
jiang42
2014-05-23 12:04:38 +08:00
我是理解成 C 里面的 null 指针的
manfay
2014-05-23 12:05:47 +08:00
这个问题更加像是 == 与 is 的区别吧。
在Python里,== 是值相等,is是对象相等,对象相当于一个内存区块。所以如果两者在内存里储存在不同的地方,is的测试结果就为False。
(我只是初学者,有可能理解得不对……)
sandtears
2014-05-23 13:38:24 +08:00
None 就代表一个什么都没有的东西,类型是 NoneType, 而 "[]" 代表一个空的列表,它的类型是 list
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
2014-05-23 14:43:02 +08:00
print type([])
print type(None)
manfay
2014-05-23 14:53:39 +08:00
@sandtears 即使类型相同,两个空列表的is测试也可能为False。

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

结果为False
tongle
2014-05-23 15:49:57 +08:00
None is just None
type(None)
<type 'NoneType'>
walleL
2014-05-23 16:36:51 +08:00
None 是一个特殊 Python 对象, 在 Python 解释器启动时自动创建, 解释器退出时销毁
在一个解释器进程中只有一个 None 存在, 因为不可能有其他对象会使用 None 已占用的内存(它就是占了个坑)
所以只有: None is None and None == None
tonghuashuai
2014-05-23 17:29:39 +08:00
用指针来说
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
2014-05-23 17:41:32 +08:00
不考虑实现细节,只看隐喻的话,None 顾名思义就是没有;为啥会觉得空列表和没有/不存在是等价的?
hitsmaxft
2014-05-23 18:00:59 +08:00
nobody => None

One => Interger(1)

EmptyList => List()

isFalse => False(1)

isTrue => True(1)

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

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

你可以说这两个水杯相等(也就是 "=="),但不能说他们是同一个水杯(也就是 "is")
zog
2014-05-23 19:02:20 +08:00
@manfay id(a),id(b),你会发现他们指向对象不是同一个,所以is会False
zog
2014-05-23 19:03:52 +08:00
is为true时候是他们id同样,公用同一指针~
zog
2014-05-23 19:06:07 +08:00
推荐阅读: https://docs.python.org/3.3/reference/datamodel.html 仔细阅读一下数据模型。搞清楚引用,对象,对象值之间的关系,搞清楚引用赋值,浅拷贝,深拷贝,这三者的差异。
yakczh
2014-05-23 19:09:09 +08:00
None相当于js的undefined
jsonline
2014-05-23 19:17:39 +08:00
is 和 equal 是不同的,亲

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/113910

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX