来自Python的意外行为

时间:2014-11-14 14:04:36

标签: python python-2.7

我是Python的新手,我对Python处理空对象的方式感到困惑。

考虑这段代码;

a = {}

if a:
    print "a is alive!"
else:
    print "a is NOT alive!"

if not a:
    print "NOT a!"
else:
    print "a!"

if a is None:
    print "a is None!"
else:
    print "a is NOT None!"

我得到了这段代码的以下输出。

a is NOT alive!
NOT a!
a is NOT None!

编辑::

我假设{}初始化的对象是有效对象。为什么Python不这样对待它?为什么我得到diff if diff条件的差异输出?

编辑2 ::

在C ++中,当我说

 Object obj;
 if (obj){
 }

如果obj为非NULL(无论是垃圾值还是其他),它将进入IF块

但是当我翻译成python时也是如此。

a = {} #This is a valid object
if a:
# Doesn't work!

为什么呢?我读Python评估{}为False。那是为什么?

4 个答案:

答案 0 :(得分:2)

Empy dict / sets / lists等被评估为false。没有它是自己的类型,只有一个可能的值。

https://docs.python.org/2.4/lib/truth.html告诉你什么被评估为真和假

答案 1 :(得分:1)

它是一个有效的python对象,但它是空的,因此被视为False,列表[]或数字0也是如此。你有一个dict,但它不是None对象。

答案 2 :(得分:1)

我的输出中没有看到任何奇怪的东西。 我们一步一步走:

  • a是字典,更具体地说是字典 object ;
  • a是字典,但它是空的,因此其真值为False

因此:

  • 第一个if,因为aFalse,会打印else语句,这是正确的;
  • 第二个if,因为not a评估为True因为aFalse,所以打印if部分,这也是正确的。
  • 最后但并非最不重要的是a不是None对象,而是dict对象,因此也可以拍摄并打印else部分。< / LI>

答案 3 :(得分:0)

a = {}

您正在创建一个字体对象,而不是NoneType 使用

检查对象的类

(a)型

会给你:

  

输入dict

if not a:
如果a已经有任何成员,

将返回False,如果a只是空列表

,则返回True