Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么在检查另一个字符串中是否有空字符串时返回True?_Python_String_Python Internals - Fatal编程技术网

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