python: 字符串比较没有按预期工作

python: string comparison do not work as expected

我的程序是这样的:

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 returns: 'default'.

这就是您要查找的内容:

if filename == "default" :

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

==两次比较两个字符串是否相等

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

简答:

if filename == "default" :

长答案:

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

请注意,将两个字符串 constantsis 进行比较实际上 return 为真。

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        ...