吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 659|回复: 12
收起左侧

[求助] 判断一个变量是否存在为啥不能用is true嘞

[复制链接]
rosybliss 发表于 2023-11-3 13:56
在看论坛里以前有好人发的****python课,里面他讲的一段关于类的链式操作我看不懂,如果画蓝色圈的地方写的是if self.__attr is True或者==True,没错但是结果就不是这样了,难道判断存在不能加is true吗 image.png

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| rosybliss 发表于 2023-11-3 14:39
还有,为啥return是getattr的函数里的,key值却能返回到attr呢,搞不明白
shitdevops 发表于 2023-11-3 16:01
==用于比较两个对象的值是否相等,而is用于比较两个对象的身份是否相同,is和==的结果可能不同,因为它们可能指向不同的内存地址,但内容相同
surepj 发表于 2023-11-3 16:01
if self.__attr就是if self.__attr == True的简写方式,Python没见过if self.__attr is True这种写法。
kof21411 发表于 2023-11-3 16:02
这是
t2=Test2()
t2.a

Test2(‘a’)
的区别了
t2.a只是修改了内部变量key
Test2(‘a’)才是修改__attr
天下客 发表于 2023-11-3 16:36
代码中的
self.__attr
不是bool值,那个
if self.__attr
是在判空,其应该等价于
if self.__attr != None
if self.__attr is not None
天下客 发表于 2023-11-3 16:50
本帖最后由 天下客 于 2023-11-3 17:03 编辑
rosybliss 发表于 2023-11-3 14:39
还有,为啥return是getattr的函数里的,key值却能返回到attr呢,搞不明白

因为return的值是重新实例化了一个对象,相当于t2.a == Test2('a'),这就是return的作用,所以会调用这个对象的__init__()函数,也就把这个值传给了attr
天下客 发表于 2023-11-3 17:08
天下客 发表于 2023-11-3 16:36
代码中的不是bool值,那个是在判空,其应该等价于或

我刚试了下,其实也不等价于None,python中‘’和None不一样,还是应该老老实实地等价于if self.__attr  != ''或if self.__attr is not ''
hero2022 发表于 2023-11-3 19:34
if self.__attr
其实它本意是self.__attr被赋值了,就走进if里面。
python中,非空字符串、非0数字、True等在if中都认为是“真”,所以没必要用is True 、not None来判断,也覆盖不全,判断不准,直接不用判断,底层库自己判断即可。
LoveCode 发表于 2023-11-3 21:25

关于 == 运算符和 is 运算符

首先,if self.__attr is Trueif self._attr == true 它是有区别的,这涉及到 “变量(或者说对象)的相等性”。相关的内容在书籍《流程的 Python 第二版》中有详细的论述。

image-20231103204929883.png

如果楼主懂 C 语言指针的概念,那么相当于:== 比较的是两个指针指向的值,is 比较的是两个指针的值。

这是我之前的笔记,不知道你能否看懂。

image-20231103205643398.png

我再举个例子:

image-20231103210206564.png

所以楼主图片中的 if self.__attr 表达式是在判断 __attr 是否可被视为真(非 0 数值、非空字符串、非空列表、非空字典等等都被视为真),所以整个表达式相当于 if self.__attr == True

此时是不能使用 is True 的,否则就是在判断 __attr 是否为布尔类型的 True


关于代码中的 return Test2(key)

至于这个,我觉得楼主应该主动调试一下代码,跟着走完一遍处理的流程就懂了。

我简单说一说 test.a.b 的过程,楼主自己再思考一下 test.a.b.c 中访问 c 成员的过程吧:

  1. 首先 t2 = Test2() 时,t2.__attr 为空字符串。
  2. 当执行 t2.a 时,t2 自身并没有 a 成员,所以它会执行到 __getattr__ 方法,此时 t2.__attr 为空字符串,被视为假,故 t2.a 表达式的值就是该方法的返回值 Test2("a")
  3. 也就是说 t2.a.b.c 相当于 Test2("a").b.c。这里我把临时的 Test2("a") 取名为 temp,它的 __attr 属性为字符串 a
  4. 同理,当执行到 temp.b 时,因为 temp.__attr"a",所以可以进入 if 语句块,得到 keya.b
  5. 最后,temp.b 的值相当于 Test("a.b")。整个表达式又变成了 Test("a.b").c 了。

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
苏紫方璇 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
hrh123 + 1 + 1 用心讨论,共获提升!

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 17:43

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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