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。你的情况:
请注意,将两个字符串 constants 与 is
进行比较实际上 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 ...
我的程序是这样的:
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。你的情况:
请注意,将两个字符串 constants 与 is
进行比较实际上 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 ...