python中true和false是变量吗_python中的true和False可以分别重新分配为False和True吗?...

我想我只是目睹了一些非常可怕的东西,而且很难消化!

所以在我的项目中,我遇到了这段美丽的代码

from CoreDefaults import FALSE, TRUE

在查看CoreDefaults模块后,我看到了这一点

TRUE = 1 == 1     # some part of my mind was blown here

FALSE = 0 == 1    # which I honestly thought was clever and it really is!

但后来它提出了一个问题,当python给出默认的True和False时,为什么有人会评估True和False的值然后分配给这些变量但是我得到了预感,任何人都会做的唯一原因是这些值是否可以重新分配!

所以我尝试了以下内容

>>> True

True

>>> False

False

>>> True = False   # True is assigned to False and it is NOT OK ?

>>> True

False              # Python, I think it's over between you and me.

这种行为是否正常?这是应该实施的方式吗?为什么不让它不可编辑?使用python时这是一个安全风险还是与其他语言一样?任何聪明的方式使它更像不可编辑,就像我需要覆盖的任何内置?我今晚怎么睡着了?

我正在使用python 2.6.6。

编辑1:

那么我们可以使用0和1代替False和True吗?我认为这更难以证明了吗?

好像它在python 3.6中不起作用:"无法分配给关键字"

制作不可编辑的东西是创造一个特例。 Python试图避免特殊情况。如果你真的坚持下去,Python可以让你自己动手。

是的,在Python2 True和False中是简单变量,可以使用新值进行分配。没什么好担心的,因为每个模块都有自己的全局范围。

如果您使用的是2010年8月发布的Python版本,那么担心重新绑定内置版本是您遇到的最少问题。

@Daniel:所以在一个模块中True可能是True而在其他模块范围内True可能是False?那将更加疯狂!

@ d-coder:True和False是简单名称,因此属于某个范围,与任何其他变量一样。你为什么不担心任何其他常数被覆盖?

@Daniel:我没有尝试过其他变量,但我(或任何其他python狂热分子)希望True为真,因为关键字/ constant / variable表示它是!

@ d-coder:和True将是真的,直到你有意识地改变它。当她/他寻找True = something时,每个人都会立刻看到它。

@Daniel:嗯。那么我们应该使用0和1而不是True和False吗?这听起来确实是失败的。

@ d-coder:它总是失败证明,因为你控制你的代码,所以没有人覆盖True。

在Python 2中,True和False内置"常量"。你说它不安全是对的。但是Python实际上并没有常量,所以为了不可能分配不同的值,它们需要是关键字。 True和False是Python 3中的关键字。但是将这些新关键字添加到Python 2本身就具有破坏性。

"你说这不安全是对的。"从安全的角度来看?也许我正在遭受想象力的失败,但你能详细说明吗?请记住,任何以"首先,攻击者获得对源代码的写入权限"开头的攻击策略都将生效,无论True和False是否可写。

谁说了一个关于攻击者的事情?这是不安全的,因为它可以意外地改变你知道的东西的价值(或者在这种情况下,相信你知道)是一个常数。考虑一个传递给函数的布尔值列表,然后错误地将值赋给该列表的元素(因为您得到的参数顺序错误)。等等。

我怀疑"你是不是很安全"是从代码可靠性的角度来看,虽然OP确实询问了安全性。人们是否应该能够用脚射击自己是绝对主观的,而Python倾向于让程序员有能力做任何事情。

"谁对攻击者说了什么?" - 哦,我以为你回答了OP的问题,"这是一个安全风险[?]"。如果你只是在谈论一个用户如何指责任务并获得一堆真正奇怪的错误,我同意这是可能的。

BoarGules答案大多正确但不完整。内置的bool类型和内置的False和True是在2.2.z版本之一中添加的。 (这是在"维护版本中没有新功能"规则之前。事实上,中期版本添加引起的混乱是规则的原因之一。)

在此之前,想要使用False和True的人必须在代码顶部附近编写类似下面的内容。

False, True = 0, 1

使False和True不可编辑的关键字会破坏现有代码。这确实是令人厌恶的。添加后,人们可以选择编辑他们的代码

try:

False

except NameError:

False, True = 0, 1

按顺序,当运行较新的2.x版本时,要使False和True为bool,并打印为'False'和'True',而是打印为0和1。

在3.0中,当大多数人已经放弃对2.2及之前的支持,因此不再需要分配备选方案时,False和True成为关键字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值