我的书说——
字符串和列表实际上是相似的,如果您将字符串视为单个文本字符的"列表"。
假设我有一个字符串,即 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
它返回真!也就是说,Python 说 Zophie 包含一个名为 ’Zop’
的项目,但是当我尝试使用 for 命令列出所有项目时,Zop
没有出现。
这是怎么回事?
有两种不同的in
:
-
for i in name
:单词in
是for
循环语法的一部分。该语句迭代了可迭代name
的元素。如果name
是字符串,则它会遍历字符串的字符。 -
'Zop' in name
:单词in
是一个比较运算符。从文档中,5.9.1 成员资格测试操作:对于字符串和字节类型,当且仅当
x
是y
的子字符串时,x in y
True
。等效测试是y.find(x) != -1
。空字符串始终被视为任何其他字符串的子字符串,因此"" in "abc"
将返回True
。
任何 Python 类都可以自由定义各种操作。字符串碰巧实现了序列协议(意味着迭代和[i]
项访问的行为与列表相同(,但也实现了负责x in y
检查的__contains__
来查找子字符串而不仅仅是单个字符。
x in y
成员资格测试通常意味着"如果你打印y的所有元素,x就会出现",但没有规则说必须如此。
查看成员资格测试详细信息部分,该部分与in
关键字相关。从那里转述,
对于字符串和字节类型,
True
x in y
当且仅当 x 是 y 的子字符串。等效测试是y.find(x) != -1
。空字符串 始终被视为任何其他字符串的子字符串,因此"" in "abc"
将返回True
。
虽然,我强烈建议可以在子字符串的成员资格测试中选择re
模块的优雅使用。