为什么['abc']中的'a'为True,而['abc']中的'a'为False?


72

使用解释器时,表达式'a' in ('abc')返回True,而'a' in ['abc']返回False。有人可以解释这种行为吗?


40
('abc')不是元组,只是字符串'abc'。要实际检查包含字符串的元组中的成员资格'abc',请使用a in ('abc',)
dano 2015年

13
这是由于括号在表达式优先级和元组中的双重使用,导致单元素元组的语法很奇怪
njzk2

2
括号中('abc')的内容仅用于装饰,也可能引起混乱。我花了一段时间才克服了这个问题。我也认为括号表示特殊的东西(例如方括号或花括号,这确实意味着特殊)。在这种用法中,那些括号的含义为零。xyz = (x, y, z)和之间没有区别xyz = x, y, z。逗号的存在具有特殊含义(除非是空元组,否则()确实具有特殊含义)。
戴维·哈门

3
当然,您可以输入'abc'('abc')然后['abc']输入解释器,然后查看它们的含义。
2015年

Answers:


136

('abc')与相同'abc''abc'包含子字符串'a',因此'a' in 'abc' == True

如果要使用元组,则需要编写('abc', )

['abc']是一个列表(包含单个元素,字符串'abc')。'a'不是此列表的成员,因此'a' in ['abc'] == False


49

('abc')不是元组。我认为你把它与元组混淆了('abc',)

实际上,('abc')是相同'abc',一个array of characters其中a作为字符是在它的,因此,第一查找返回True

>>> 'a' in 'abc'
True

另一方面,['abc']是一个字符串列表或一个字符列表(您可以将其视为2维字符矩阵[['a', 'b', 'c']],其中a,作为单个字符,不是外部列表的成员。实际上,它是内部列表的第一个字符:

>>> 'a' in ['abc']
False

>>> 'a' in ['abc'][0]
True

>>> 'a' == ['abc'][0][0]
True

您能告诉我和/或添加有关此含义的参考吗'a' == ['abc'][0][0]
Ahmed

'a'== ['abc'] [0] [0]“ a”在(列出第一个elem>第一个字符)
dsgdfg

2
或者换句话说,一旦应用了第一个[0],就剩下了'a' == 'abc'[0](它给出了列表的第一个元素),然后,应用了第二个之后[0],就剩下了'a' == 'a',其结果为True
Carcigenicate 2015年

2
@Ahmed['abc'][0]给你'abc''abc'[0]给你'a'
ozgur 2015年

3

('abc')您得到“ a”,则('abc')返回true。

但是['abc']因为它是一个数组列表,所以您得到“ a”以['abc']返回false。

例:

输入: ('abc') == 'abc'

输出: True

因此,如果我们在('abc')中调用'a',则与在'abc'中的'a'相同,因为('abc')不是元组,但'abc'是一个字符数组,其中字符'a'在字符串'abc'的索引0。

另一方面,['abc']是数组列表,其中'abc'是单个字符串,位于数组['abc']的索引0处。

Tupple示例: x = ('abc', 'def', 'mnop')

数组示例: x = ['abc', 'def', 'mnop']

要么

x = ('abc'), y = 'abc'

这里总是x == y

但是在'a' in ['abc']=>的情况下

x = ['abc'], y = 'abc'

在这里x != y但是x[0] == y


2

正如其他人提到的,('abc')不是元组。 'a'不是的元素['abc']。该列表中唯一的元素是'abc'

x='abc' in ['abc']

print (x)

True #This will evaluate to true

这也将评估为true:

y = 'a' in ['a','b','c']

print (y)

True

0

('abc')等价于'abc'

'a' in ('abc')等价于'a' in 'abc'

'a' in ('abc', )返回False'a' in ['abc']

'a' in ['a', 'b', 'c']返回True'a' in 'abc'

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.