当前位置: 首页 > 知识库问答 >
问题:

Python的意外行为

仲智
2023-03-14

我是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输出?

在C++中,当我说

 Object obj;
 if (obj){
 }

如果obj不是NULL,它将进入IF块(不管它是垃圾值还是其他)

但当我翻译成Python时也是一样的。

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

为什么?我读到Python将{}计算为false。这是为什么?

共有3个答案

伍光济
2023-03-14

它是一个有效的python对象,但它是空的,因此它被视为false,列表[]或数字0也是如此。您确实有一个dict,但它不是none对象。

奚瑾瑜
2023-03-14

Empy DICT/集合/列表等的计算结果为FALSE。None是它自己的类型,只有一个可能的值。

https://docs.python.org/2.4/lib/truth.html告诉您什么被计算为true和false

终彬郁
2023-03-14

我看不出你的输出有什么奇怪的。让我们一步一步走:

  • a是dictionary,更具体地说是dictionary对象;
  • a是一个字典,但是它是空的,所以它的真值是false

因此:

  • 由于Afalse,第一个if打印else语句,这是正确的;
  • 第二个if(因为not a计算结果为true,因为afalse)打印if部分,这也是正确的。
  • 最后,但并非最不重要的是a不是none对象,而是dict对象,因此取下并打印else部分也是正确的。
 类似资料:
  • 问题内容: 我想撤消一个列表,但是我设法做到了,但是在工作的中间我发现了一些奇怪的事情。下面的程序按预期工作,但list_reversed [i] = list [len(list)-1-i] 和 print(list [i]) (顺理成章地注释了 最后一行 )这 行 引起了 list 的更改。我没看到什么?我的Python版本是3.3.3。先感谢您。 问题答案: 以下: 使两个变量引用相同的列表

  • 问题内容: 前一阵子,在使用Class.getMethod和自动装箱时,我遇到了类似的问题,因此在自己的查找算法中实现它很有意义。但是,真正让我感到困惑的是,以下两种方法也不起作用: String.class实现了Serializable接口,我确实希望它包含在lookup方法中。 我也必须在自己的查找算法中考虑这一点吗? 编辑 :我确实读过Javadoc, 所以让我强调一下问题的第二部分 :如果

  • 问题内容: 我试图了解扩展在Python中是如何工作的,并且并没有达到我的期望。例如: 但我本来期望: 为什么返回None而不是扩展列表? 问题答案: 该方法将追加到现有数组并返回。在您的情况下,您正在动态创建一个数组-对其进行扩展,然后将其丢弃。该变量以返回值结束。

  • 请注意,NULL字节始终存在,您可以使用检查它。 我知道我可以使用获得类似的结果。我不是在问其他选择,我只是想了解格式字符(如doc所说的“NUL填充字符串”)背后的逻辑。 “NULL”值在哪里涉及到所有这些?

  • 我有以下输入字符串: 这里有各种各样的错误:标题前面有“。”应该是ID后面的分隔符。作者姓名的最后两个字符出现在日期字段中,实际日期丢失。 我怎样才能纠正这些问题?

  • 问题内容: 我有以下代码: 我希望它返回“ 05/20/2012”,但它返回“ 04/20/2012” 这对我来说毫无意义-有人可以帮助我了解发生了什么以及如何获得正确的响应吗? 感谢您的关注! 问题答案: 从零开始。如和 尝试