【问题标题】:python: string comparison do not work as expectedpython:字符串比较不按预期工作
【发布时间】:2015-12-01 09:13:57
【问题描述】:

我的程序是这样的:

filename=sys.argv[1]
print "filename is default?", (filename is "default")
if (filename is "default"):
  filename="..."
readfile(filename)

我在命令行中输入 python ....py default。那么输出是:

文件名是默认的吗?假的

IOError:...No such file or directory 'default'.

我使用pdb,在 if 语句执行之前,p filename 返回:'default'

【问题讨论】:

标签: python string string-comparison


【解决方案1】:

使用==两个比较两个字符串是否相等。

使用is来测试是否是同一个字符串。

【讨论】:

  • 顺便说一句,我怀疑你曾经想使用is比较字符串身份。
  • 嗯,如果我尝试a = "foo"; b = "foo"; print (a is b), (a == b) 我会得到两次True,有什么想法吗?
  • @adrianus 对于解释器,"foo" 是一个常数。查看我的答案以获得更详细的解释。
  • @DanielHepper 啊,太棒了,谢谢!我也刚刚注意到a = "foo"; b = "foo"; print id(a), id(b) 两次返回相同的值...
  • @adrianus 这是一个优化技巧。解释器对 a 和 b 使用相同的变量,因为它“知道”它们是相同的。另一方面,当你说filename=sys.argv[1] 时,解释器不会优化它,因为它事先不知道sys.argv[1] 会是什么。
【解决方案2】:

这就是你要找的东西:

if filename == "default" :

== 运算符用于比较,而is 运算符测试两个变量是否指向相同的对象,而不是两个变量是否具有相同的值。

【讨论】:

    【解决方案3】:

    简答:

    if filename == "default" :

    长答案:

    is 检查对象身份。要检查是否相等,请使用==。检查Python documentation on comparisons。在你的情况下:

    请注意,将两个字符串 constantsis 进行比较实际上会返回 true。

    def f():
        a = "foo"
        b = "foo"
        print(a is b)   # True, because a and b refer to the same constant
        x = "f" + "oo"
        print(a is x)   # True, because the addition is optimized away
        y = "f"
        z = y + "oo"    #
        print(a is z)   # False, because z is actually a different object
    

    您可以通过反汇编 CPython 字节码来了解幕后发生的事情:

    >>> import dis
    >>> dis.dis(f)
    2         0 LOAD_CONST               1 ('foo')
              3 STORE_FAST               0 (a)
    
    3         6 LOAD_CONST               1 ('foo')
              9 STORE_FAST               1 (b)
    
    4        ...
    
    5        28 LOAD_CONST               4 ('foo')
             31 STORE_FAST               2 (x)
    
    6        ...
    
    7        50 LOAD_CONST               2 ('f')
             53 STORE_FAST               3 (y)
    
    8        56 LOAD_FAST                3 (y)
             59 LOAD_CONST               3 ('oo')
             62 BINARY_ADD
             63 STORE_FAST               4 (z)
    
    9        ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-23
      • 2014-05-26
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多