【发布时间】:2021-08-30 00:42:03
【问题描述】:
在版本中。 3.9.5:
>>> s1 = {True,1,1,2}
>>> s1
{True, 2}
>>> s2 = {1,1,True,2}
>>> s2
{1, 2}
给人的印象是 True 之后的所有后续 1 都被丢弃,并且 1 之后的所有 True 也被丢弃,同时正在构造 set 对象。但是在这两种情况下都不会忽略除 1 之外的其他 Truthy 值。
>>> s3 = {False,0,""}
>>> s3
{False, ''}
>>> s3 = {False,(),0,""}
>>> s3
{False, '', ()}
>>> s4 = {0,False,(),0,""}
>>> s4
{0, '', ()}
比对 False 和零。
我无法在 3.9.5 的 python 文档中明确找到有关此逻辑的信息。但是我可以看到一些关于字典实现的文献,而没有使用键来创建集合和优化要求。我还瞥见了set object implementation 的集合对象实现,这超出了初学者的范围,我向这 49 位贡献者和 Ramond Hettinger 先生致敬。简单地说,我理解底层逻辑使用散列函数来区分不同的值。 因此我必须使用
>>> hash(True)
1
>>> hash(3)
3
>>> hash(0)
0
>>> hash(False)
0
>>> hash(())
5740354900026072187
向初学者解释为什么设置对象构造会这样。但是
>>> hash("")
0
尽管它被包含在上面的 s4 示例中。因此我需要进一步的逻辑。
现在回答问题。是否有任何 python 文档或文章解释了在构造集合对象时确定唯一元素的方式,以使 Python 初学者受益。我在各种教程中的搜索都是徒劳的。我是否遗漏了一些非常明显的东西?
感谢您的宝贵时间。
【问题讨论】: