为什么这个python逻辑语句的行为与我预期的行为相反?

时间:2012-04-19 23:11:13

标签: python if-statement boolean-logic python-2.x

我在Python解释器中运行以下命令:

  some_list = []
  methodList = [method for method in dir(some_list) if (callable(getattr(some_list, method)) and (not method.find('_')))]

我想要的是获取特定对象的所有方法名称列表,除了以下划线命名的方法,即__sizeof__

这就是为什么我将if语句嵌套在上面的代码中:

 if (callable(getattr(some_list, method)) and (not method.find('_')))

methodList的内容是:

['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__']

确实,与我期待的完全相反。

如果not method.find('_')字符串无法包含字符串method,那么'_'只会返回true吗?

1 个答案:

答案 0 :(得分:6)

请参阅str.find的文档。

  

返回找到substring sub的字符串中的最低索引,这样sub包含在切片s [start:end]中。可选参数start和end被解释为切片表示法。如果未找到sub,则返回-1。

如果未找到下划线,则表达式method.find('_')返回-1,如果以下划线开头,则返回0。应用not意味着只有以下划线开头的方法才能提供True(因为not 0True)。

改为使用'_' not in method