鱼C论坛

 找回密码
 立即注册
查看: 165|回复: 6

[已解决]最后的false是怎么返回回来的?

[复制链接]
发表于 2024-8-1 16:04:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
>>> class C:
        def __init__(self, data):
                self.data = data
        def __contains__(self,item):
                print('ok')
                print(item)

                
>>> c = C([1, 2, 3, 4, 5])
>>> 3 in c
ok
3
False
>>> 6 in c
ok
6
False

请看上面这段代码,我没有在 "__contains__"方法里面写 return 语句, 为什么我在执行" 3 in c "这条语句的时候,自动返回了False呢?
最佳答案
2024-8-1 16:33:50
wbzxz 发表于 2024-08-01 16:33
>>> class C:
        def __init__(self, data):
                self.d ...


哈哈,看来你抓住了一个有趣的细节!让我们一起来理清楚这个逻辑。

在你的`__contains__`方法中,你返回的是`item`本身,而不是一个布尔值。对于Python来说,任何非空的一般对象(比如整数`3`、字符串、列表等)在布尔上下文中都是“真”的(即`True`),而只有以下几种情况会被视为“假”:

- `None`
- `False`
- `0`(零)
- 空的容器(如`[]`、`{}`、`()`等)

所以,在你的代码中,当你执行`3 in c`时,实际调用的是`c.__contains__(3)`,该方法打印出`ok`和`3`后,返回了`3`。因为`3`被视为“真”,因此`in`操作符最终返回`True`。

对于`None in c`,`c.__contains__(None)`返回的是`None`。`None`是“假”,所以`in`操作符返回`False`。

最后,`True in c`也是相似的道理,`c.__contains__(True)`返回`True`,而`True`被视为“真”,所以返回`True`。

总结一下:你返回的实际上是传入的`item`,然后Python根据这个值是否“真”来决定`in`运算的最终结果。如果你想更明确地控制`in`运算的返回值,可以直接返回`True`或`False`。例如:
def __contains__(self, item):
    print('ok')
    print(item)
    return item in self.data  # 假设你想检查 item 是否真的在 data 中

希望这个解释能帮你搞清楚这个问题!如果还有其他问题,随时提问哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-8-1 16:07:28 | 显示全部楼层
哈哈,好的问题!在Python中,当你使用`in`关键字检查一个对象是否包含某个元素时,实际上是调用该对象的`__contains__`方法。当你没有显式地返回任何值时,Python会默认返回`None`。但是,你可能会注意到你得到了`False`而不是`None`。

那么,究竟发生了什么呢?

在你的代码中,`c = C()`创建了一个对象`c`,然后你尝试在这个对象中查找`3`,实际上是执行了`c.__contains__(3)`。由于你在`__contains__`方法中没有返回任何内容,Python的默认返回是`None`。然而,对于`in`运算符来说,它的内部实现会把这个返回值与`False`进行比较。

具体来说,Python会自动处理包含关系:如果你在`__contains__`中没有返回`True`,它就会默认为`False`。换句话说,你虽然没有写返回语句,但`in`操作符的实现逻辑就是这样处理的。

所以在你执行`3 in c`时,由于`__contains__`没有返回`True`,Python就聪明地把它当成了`False`。就像一位老师问你:“你准备好了吗?”而你只是沉默着摇头,老师自然就会认为你还没准备好,不用过多解释!

希望这个解释让你笑了,也让你明白了!如果还有问题,随时问我哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-1 16:24:42 | 显示全部楼层
FishC 发表于 2024-8-1 16:07
哈哈,好的问题!在Python中,当你使用`in`关键字检查一个对象是否包含某个元素时,实际上是调用该对象的`_ ...

哦,那是不是可以这样理解,两个问题:
1. 虽然我定义了`__contains__`方法, 但是针对in运算符来说,它除了执行`__contains__`方法的内容之外,还要和  `__contains__` 方法的返回值,进行一次逻辑运算符是"or"的逻辑运算呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-1 16:24:54 | 显示全部楼层
wbzxz 发表于 2024-08-01 16:24
哦,那是不是可以这样理解,两个问题:
1. 虽然我定 ...


哈哈,你的理解有点道理,但实际上Python内部并没有直接使用“或”运算符来处理`in`操作。我们可以这样理解:

1. 当你使用`in`运算符时,Python会调用对象的`__contains__`方法来检查某个元素是否在对象中。
2. 如果`__contains__`返回了`True`,那么`in`运算符就会返回`True`,表示元素确实在对象中。
3. 如果`__contains__`返回了`False`或者没有返回值(即默认返回`None`),Python就会将其视为`False`。

所以说,实际上`in`运算符只是在内部判断`__contains__`的返回值,看它是不是`True`。如果不是,就会返回`False`。而不是在`None`和`False`之间用“或”运算符进行逻辑运算。

可以简单地想象成这样:`in`运算符借助`__contains__`来询问对象:“这个元素在你这里吗?”然后对象要么回答“是的,我有”(返回`True`),要么答非所问(返回`None`或`False`),最后`in`运算符就根据这两种情况做出结论。

希望这个解释能更清楚!如果还有任何其他疑问,我们可以一起继续深潜哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-1 16:33:36 | 显示全部楼层
FishC 发表于 2024-8-1 16:24
哈哈,你的理解有点道理,但实际上Python内部并没有直接使用“或”运算符来处理`in`操作。我们可以这样 ...
>>> class C:
        def __init__(self, data):
                self.data = data
        def __contains__(self,item):
                print('ok')
                print(item)
                return item

        
>>> c = C([1, 2, 3, 4, 5])
>>> 3 in c
ok
3
True
>>> None in c
ok
None
False
>>> True in c
ok
True
True

但是请看我上面的代码,比如" 3 in c"这条语句,返回值是3,而不是True,按照您的说法,不是True的话,就应该返回False,而" 3 in c"这条语句实际返回的是True。请问是为什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-1 16:33:50 | 显示全部楼层    本楼为最佳答案   
wbzxz 发表于 2024-08-01 16:33
>>> class C:
        def __init__(self, data):
                self.d ...


哈哈,看来你抓住了一个有趣的细节!让我们一起来理清楚这个逻辑。

在你的`__contains__`方法中,你返回的是`item`本身,而不是一个布尔值。对于Python来说,任何非空的一般对象(比如整数`3`、字符串、列表等)在布尔上下文中都是“真”的(即`True`),而只有以下几种情况会被视为“假”:

- `None`
- `False`
- `0`(零)
- 空的容器(如`[]`、`{}`、`()`等)

所以,在你的代码中,当你执行`3 in c`时,实际调用的是`c.__contains__(3)`,该方法打印出`ok`和`3`后,返回了`3`。因为`3`被视为“真”,因此`in`操作符最终返回`True`。

对于`None in c`,`c.__contains__(None)`返回的是`None`。`None`是“假”,所以`in`操作符返回`False`。

最后,`True in c`也是相似的道理,`c.__contains__(True)`返回`True`,而`True`被视为“真”,所以返回`True`。

总结一下:你返回的实际上是传入的`item`,然后Python根据这个值是否“真”来决定`in`运算的最终结果。如果你想更明确地控制`in`运算的返回值,可以直接返回`True`或`False`。例如:
def __contains__(self, item):
    print('ok')
    print(item)
    return item in self.data  # 假设你想检查 item 是否真的在 data 中

希望这个解释能帮你搞清楚这个问题!如果还有其他问题,随时提问哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-1 21:25:59 | 显示全部楼层
楼上错误回答,应该是默认False。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 23:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表