为什么字符串中的任何有序字符看起来都是列表中与该字符串等效的部分?

时间:2017-06-18 01:52:19

标签: python string list python-3.x

我的书说 -

  

如果您认为字符串是单个文本字符的“列表”,则字符串和列表实际上是相似的。

假设我有一个字符串即 name=Zophie

现在这个字符串应该与列表有一些相似之处。所以我输入另一个代码,告诉我该列表的项目应该是什么。代码就像 -

for i in name: print(‘* * * ‘ + i + ‘ * * *')

输出结果为:

* * * Z * * * * * * o * * * * * * p * * * * * * h * * * * * * i * * * * * * e * * *

这清楚地表明name的列表项是Z,o,p,h,i,e。

现在,如果我尝试使用以下方法检查列表中是否有项目’Zop'

Zop in name

它返回True!也就是说,Python说Zophie包含一个项目’Zop’但是当我尝试使用for命令列出所有项目时,Zop没有出现。

这里发生了什么?

3 个答案:

答案 0 :(得分:2)

任何Python类都可以自由定义各种操作,但它喜欢。字符串碰巧实现了序列协议(意味着迭代和[i]项访问行为与列表相同),但也实现__contains__,它负责x in y检查,以查找< em> substrings 而不仅仅是单个字符。

x in y成员资格测试的常用意味着“如果打印y的所有元素,则会出现x”,但没有规则说是这样的。

答案 1 :(得分:2)

有两种不同的in s:

  • for i in namein这个词是for-loop syntax的一部分。 该语句迭代可迭代name的元素。 如果name是一个字符串,则它会迭代字符串的字符。

  • 'Zop' in name:单词in是比较运算符。从文档中5.9.1 Membership test operations

      

    对于字符串和字节类型,当{且仅x in yTrue的子字符串时,xy。等效测试是y.find(x) != -1。空字符串始终被视为任何其他字符串的子字符串,因此"" in "abc"将返回True

答案 2 :(得分:0)

查看Membership test detail上与in关键字相关的部分。从那里解释,

  

对于字符串和字节类型,当{并且仅当x是a时,x in yTrue   y的子串。等效测试是y.find(x) != -1。空字符串   始终被视为任何其他字符串的子字符串,因此"" in "abc"将返回True

虽然,我强烈建议可以通过子字符串的成员资格测试来选择re模块的优雅使用。