python:字符串比较不能按预期工作

时间:2015-12-01 09:13:58

标签: python string string-comparison

我的程序是这样的:

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'

3 个答案:

答案 0 :(得分:3)

这就是你要找的东西:

if filename == "default" :

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

答案 1 :(得分:3)

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

使用is来测试它是否是相同的字符串。

答案 2 :(得分:1)

简答:

if filename == "default" :

答案很长:

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

请注意,将两个字符串常量is进行比较实际上会返回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        ...