Python 为什么在检查另一个字符串中是否有空字符串时返回True?
我有限的大脑无法理解为什么会发生这种情况:Python 为什么在检查另一个字符串中是否有空字符串时返回True?,python,string,python-internals,Python,String,Python Internals,我有限的大脑无法理解为什么会发生这种情况: >>> print '' in 'lolsome' True 在PHP中,等效比较返回false: var_dump(strpos('', 'lolsome')); : 对于Unicode和字符串类型,当且仅当x是y的子字符串时,y中的x为真。等效测试是y.find(x)!=-1。注意,x和y不必是同一类型;因此,“abc”中的u'ab'将返回True。空字符串始终被视为任何其他字符串的子字符串,因此“abc”中的”将返回Tru
>>> print '' in 'lolsome'
True
在PHP中,等效比较返回false:
var_dump(strpos('', 'lolsome'));
:
对于Unicode和字符串类型,当且仅当x是y的子字符串时,y中的x
为真。等效测试是y.find(x)!=-1
。注意,x和y不必是同一类型;因此,“abc”中的u'ab'将返回True
。空字符串始终被视为任何其他字符串的子字符串,因此“abc”
中的”将返回True
通过查看您的print
调用,您使用的是2.x
要深入了解,请查看字节码:
>>> def answer():
... '' in 'lolsome'
>>> dis.dis(answer)
2 0 LOAD_CONST 1 ('')
3 LOAD_CONST 2 ('lolsome')
6 COMPARE_OP 6 (in)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
COMPARE_OP
是我们进行布尔运算的地方,查看
中的for可以发现比较发生的地方:
目标(比较)
{
w=POP();
v=顶部();
if(PyInt_CheckExact(w)和&PyInt_CheckExact(v)){
/*内联:cmp(int,int)*/
注册长a、b;
寄存器int res;
a=PyInt_作为_长(v);
b=PyInt_AS_LONG(w);
开关(oparg){
病例PyCmp_LT:res=a=b;中断;
案例PyCmp_是:res=v==w;break;
案例PyCmp_不是:res=v!=w;break;
默认值:转到慢\u比较;
}
x=res?Py_True:Py_False;
Py_增量(x);
}
否则{
慢比较:
x=cmp_结果(oparg,v,w);
}
Py_DECREF(v);
Py_DECREF(w);
设置顶部(x);
如果(x==NULL)中断;
预测(如果为假,则弹出跳转);
预测(如果为真,则弹出跳转);
分派();
}
在哪里,我们很容易找到下一条线索:
res=PySequence\u包含(w,v);
这是在:
{
使用结果;
if(PyType_HasFeature(seq->ob_type,Py_TPFLAGS_has_SEQUENCE_IN)){
PySequenceMethods*sqm=seq->ob_类型->tp_as_序列;
如果(sqm!=NULL&&sqm->sq_包含!=NULL)
返回(*sqm->SQU包含)(序号,ob);
}
结果=_PySequence_IterSearch(seq,ob,PY_IterSearch_包含);
返回Py_SAFE_DOWNCAST(结果,Py_ssize_t,int);
}
为了从源头获取空气,我们在
此函数可由PySequence\u Contains()
使用,并具有相同的签名。此插槽可以保留为NULL,在这种情况下,PySequence\u Contains()
只遍历序列,直到找到匹配项
以及:
确定o是否包含值。如果o中的一项等于值,则返回1
,否则返回0
。出现错误时,返回-1
。这相当于o
中的Python表达式值
如果'
不是null
,可以认为序列'lolsome'
包含它。引用
在haystack
字符串中查找针
第一次出现的数值位置
因此,您实际尝试的与下面看到的Python构造类似
>>> print 'lolsome' in ''
False
因此,您实际上应该编写如下所示的代码,以便在PHP中进行相应的比较
var_dump(strpos('lolsome', ''));
即使这样,它也会发出警告并返回false
PHP警告:strpos()
:第3行的空针输入/home/thefourtheye/Desktop/Test.PHP
bool(false)
我挖得更深,发现
他们认为被搜索的空字符串是一个有问题的例子。因此,他们发出警告并返回
false
。除此之外,我找不到任何文件讨论为什么它被视为一个问题
就Python而言,这种行为在
空字符串始终被视为任何其他字符串的子字符串,因此“abc”
中的”将返回True
假设你有两堆相似的物品,比如说,你最喜欢的诗人的最佳诗节,分别是5节和2节。较大的集合包含较小的集合吗?如何检查:
1) 对于较小的一堆中的任何一节,您都可以在较大的一堆中找到它。
2) 较小的堆不包含较大堆中缺少的东西
因此,我们可以使用此伪代码来检查:
for object in smaller:
if object not in bigger:
return 'we found object from smaller absent in bigger'
else:
go to next object
return 'all is ok - all objects from smaller are in bigger'
如果你还没有找到这样一个对象,你就到了algo的末尾,认为较小的是较大的一个子集
现在想象一下更小的一堆是0节。
应用上面相同的规则,我们执行0次检查,也没有从较小的对象中找到较大的对象中缺少的对象
因此,将空字符串视为任何其他字符串的子集是正确且方便的。甚至它自己。这是用python实现的
>>> '' in 'adfsf'
True
>>> '' in ''
True
基本上,从数学上来说:
空集是每个集合的子集
同样的逻辑在这里也适用。你可以考虑<代码> '/COD>空集合。因此,它是每个字符串集的子集,因为它们必须是相同的类型
>>> a = ""
>>> b = "Python"
>>> a in b
True
>>> set(a).issubset(b)
True
>>> a = set() #empty set
>>> b = set([1,2,3])
>>> a.issubset(b)
True
>>>
但是要小心!定义了一个子集和一个成员
空字符串是长度为零的唯一字符串。
空字符串是连接操作的标识元素。
空字符串位于按字典顺序排列的任何其他字符串之前,因为它是所有字符串中最短的字符串。
空字符串是合法字符串,大多数字符串操作都应在其上进行。
<>但是它似乎并不认为空字符串是完全合法的。很可能PHP是唯一一种不允许在字符串中搜索空字符串的语言
> strstr("lolsome", "");
strstr(): Empty needle :1
这是一种防御机制吗?显然,程序员不必使用if
来保护指针。如果是这样,为什么其他语言允许此测试通过!!!语言设计师
for object in smaller:
if object not in bigger:
return 'we found object from smaller absent in bigger'
else:
go to next object
return 'all is ok - all objects from smaller are in bigger'
>>> '' in 'adfsf'
True
>>> '' in ''
True
>>> a = ""
>>> b = "Python"
>>> a in b
True
>>> set(a).issubset(b)
True
>>> a = set() #empty set
>>> b = set([1,2,3])
>>> a.issubset(b)
True
>>>
> strlen("");
=> 0
> "a" . "" == "a";
=> true
> "" . "a" == "a";
=> true
> "" < "\0";
=> true
> strstr("lolsome", "");
strstr(): Empty needle :1
>>> ''.count('')
1
>>> 'a'.count('')
2
>>> 'ab'.count('')
3
>>> "lolsome".split('')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: empty separator
> "lolsome".split("")
=> ["l", "o", "l", "s", "o", "m", "e"]
awk 'BEGIN { print index("lolsome", "") != 0 }'
int main() {
printf("%d\n", strstr("lolsome", "") != NULL);
return 0;
}
#include <iostream>
#include <string>
int main() {
std::string s = "lolsome";
std::cout << (s.find("") != -1) << "\n";
return 0;
}
using System;
class MainClass {
public static void Main (string[] args) {
string s = "lolsome";
Console.WriteLine(s.IndexOf("", 0, s.Length) != -1);
}
}
(println (.indexOf "lolsome" ""))
package main
import (
"fmt"
"strings"
)
func main() {
fmt.Println(strings.Index("lolsome", "") != -1)
}
println 'lolsome'.indexOf('')
class Main {
public static void main(String[] args) {
System.out.println("lolsome".indexOf("") != -1);
}
}
"lolsome".indexOf("") != -1
s = "lolsome"
print(s:find "" ~= nil)
print index("lolsome", "") != -1;
"lolsome".find("") != -1
"lolsome".index("") != nil