代码之家  ›  专栏  ›  技术社区  ›  jchl

在Python2.6.2中,(s为“”)和(s==“”)是否可以给出不同的结果?

  •  5
  • jchl  · 技术社区  · 16 年前

    == 而不是 is 比较两个字符串是否相等。然而,是否真的有这样的情况 ( s is "" ) ( s == "" ) 将在python2.6.2中给出不同的结果?

    在代码回顾中,我指出这是不正确的,但我想给出一个例子,说明这是如何失败的。但是,尽管我可以尝试,我不能构造两个具有不同标识的空字符串。在许多常见操作中,Python实现必须将空字符串作为特例。例如:

    >>> a = ""
    >>> b = "abc"[ 2:2 ]
    >>> c = ''.join( [] )
    >>> d = re.match( '()', 'abc' ).group( 1 )
    >>> e = a + b + c + d 
    >>> a is b is c is d is e
    True
    

    this question 这说明 (s为“”) (s=“”) 可能会有所不同。谁能给我举个例子吗?

    7 回复  |  直到 9 年前
        1
  •  11
  •   Duncan    16 年前

    >>> s = u"\xff".encode('ascii', 'ignore')
    >>> s
    ''
    >>> id(s)
    10667744
    >>> id("")
    10666064
    >>> s == ""
    True
    >>> s is ""
    False
    >>> type(s) is type("")
    True
    

    Python2.6只能在执行字符串操作时以一个非正常空字符串的空字符串结束,并且不能预先确定字符串的长度。因此,当您对字符串进行编码时,错误处理程序最终会剥离字符,并在完成后修复缓冲区大小。当然,这是一个疏忽,在python2.7中很容易改变。

        2
  •  12
  •   zoli2k    16 年前

    is 测试对象的同一性和不相等性。下面是一个使用 == 给出不同的结果:

    >>> s=u""
    >>> print s is ""
    False
    >>> print s==""
    True
    
        3
  •  7
  •   John Machin Santi    16 年前

    你不应该在意。不像 None 它被定义为单例,没有规则说只有一个空字符串对象。所以 s is "" 是否依赖于实现并使用 is 不管你能不能找到一个例子都是不可能的。

        4
  •  3
  •   pycruft    16 年前

    实际上是 看起来像

    >>> class mysub(str):
        def __init__(self, *args, **kwargs):
            super(mysub, self).__init__(*args, **kwargs)
    
    >>> 
    >>> q = mysub("")
    >>> q is ""
    False
    >>> q == ""
    True
    

    编辑 :

    if x is ""
    

    表示x的值正确 和类型 ,但没有一个显式的类型测试来警告未来的维护人员或api用户等。

    if x == ""
    

        5
  •  1
  •   Jochen Ritzel    16 年前

    你找不到一个例子,因为有些东西是唯一的,不可静音的,所以Python只保留它们一次,因此 is 作品。其中包括 (), '',u'', True, False, None 0, 0.0, 1, 1.0,

        6
  •  0
  •   Philipp    16 年前

    可能不是,CPython似乎在优化 "" 在任何情况下。但正如其他人所说,不要依赖它。

        7
  •  0
  •   Eli Bendersky    16 年前

    但是Python实现并不能保证它总是能工作。将来的一些实现可能会导致它发生变化,您将面临痛苦的不兼容性问题。

    所以经验法则很简单: . 仅将操作员用于其预期用途,并有充分的文件记录。不要依赖于将来可能会发生很大变化的实现工件。