我正在比较一组字符串和一组字符串列表。结果似乎不一致,让我感到困惑。
例如,当set('3') == set(['3'])
返回True时,set('003') == set(['003'])
返回False。
谁能帮忙解释为什么会这样?
要获得完整的解释,您可以打印每个示例的set()
。
>>>set('3')
{'3'}
>>>set(['3'])
{'3'}
>>>set('003')
{0, 3}
>>>set(['003'])
{'003'}
set('003')
字符串是一个字符列表,这就是为什么它解压缩它并添加 0 和 3 作为项目。set(['003'])
这里的列表有003
的项目,因此它将解压缩该项目并添加它。
set()
将解压缩列表项并将其添加为其项。有关深层信息的更多信息,请阅读官方文档
set('003')
为该string
中的每个唯一项创建一个条目(chars
的list
(,因此它返回{'3', '0'}
并且等于set(['0','0','3'])
。
而set(['003'])
为list
的每个项目创建一个条目,所以它返回{'003'}
因为set(['003'])
返回{'003'}
,set('003')
-{'0', '3'}
。
第一种情况:
>>> set('3') == set(['3'])
True
>>> set('3')
{'3'}
>>> set(['3'])
{'3'}
第二种情况:
>>> set('003') == set(['003'])
False
>>> set('003')
{'0','3'}
>>> set(['003'])
{'003'}
当你将字符串传递给tuple
、set
、list
等时,字符串的每个字符都被视为该数据结构的一个元素。如您所知,set
是无序、独特元素的集合。因此,当您在'003'
上调用set
时,它正在创建一个集合,并尝试一次在该集合中放置一个字符。第一个字符是0
,然后是3
,然后是另一个3
,但是由于有重复,其中一个3
被忽略。所以你会得到:{'0','3'}
.在list
内有string
的情况下,整个字符串被视为一个元素,因此集合只得到一个元素,即{'003'}
。
您可以查看更多示例:
>>> tuple('abc')
('a','b','c')
>>> list('abc')
['a','b','c']