我最近开始学习Python,并且在玩套装时遇到了一些奇怪的东西.以下代码示例不会产生预期的结果.
a_set = {True,2,3,4}
a_set.add(1)
Run Code Online (Sandbox Code Playgroud)
我希望a_set有值{True, 1, 2, 3, 4}但是生成了这个代码{True, 2, 3, 4}.
尝试对此进行修改也会产生相同的结果:
a_set = {1,2,3,4}
a_set.add(True)
Run Code Online (Sandbox Code Playgroud)
预计{True, 1, 2, 3, 4}
实际 {1, 2, 3, 4}
尝试使用False并0获得相同的结果:
a_set = {False,2,3,4}
a_set.add(0)
Run Code Online (Sandbox Code Playgroud)
预计{False, 0, 2, 3, 4}
实际 {False, 2, 3, 4}
a_set = {0,2,3,4}
a_set.add(False)
Run Code Online (Sandbox Code Playgroud)
预计{False, 0, 2, 3, 4}
实际 {0, 2, 3, 4}
据我所知,bool类型是从继承int和True == 1和False == 0,但仍通过上述结果有点意外.
有人知道这种行为是否符合设计要求?也有可能有一组同时包含True,False,0,和1?
我确实进行了相当多的谷歌搜索,但无法找到我的问题的答案.
提前致谢
针对以下评论,我同意以下问题部分回答了我的问题.
Python中的False == 0和True == 1是一个实现细节还是由语言保证?
但是我觉得它没有回答我对集合行为的查询以及是否有可能有一个包含True和的集合1.即使bool是继承自的int,它们也是不同的类型,所以我发现一个集合无法区分True并且1有点混乱.所以这真是一个关于Python中集合行为的问题True == 1.
对于历史(歇斯底里?)的原因,Python的bool类型是的子类int,并且True等于1并且False等于0.
它们也会散列到同一位置:
>>> True == 1
True
>>> hash(True) == hash(1)
True
>>> False == 0
True
>>> hash(False) == hash(0)
True
Run Code Online (Sandbox Code Playgroud)
由于两个True和1被认为是平等的,他们返回相同的插槽,既set和dict把他们当作一回事.
你会看到相同的字典:
>>> True in {1: 'foo'}
True
>>> 1 in {True: 'foo'}
True
Run Code Online (Sandbox Code Playgroud)
此行为也延伸到其他数字; 浮点值等于整数值将显示相同的行为:
>>> {1.0, 1, 2.0, 2}
{1, 2}
Run Code Online (Sandbox Code Playgroud)
但至少发生这种情况的原因还有一点......显而易见.