Possible Duplicate:
String comparison in Python: is vs. ==
algorithm = str(sys.argv[1])
print(algorithm)
print(algorithm is "first")
I'm running it from the command line with the argument first
, so why does that code output:
first
False
Possible Duplicate:
String comparison in Python: is vs. ==
algorithm = str(sys.argv[1])
print(algorithm)
print(algorithm is "first")
I'm running it from the command line with the argument first
, so why does that code output:
first
False
From the Python documentation:
The operators is and is not test for object identity: x is y is true if and only if x and y are the same object.
This means it doesn't check if the values are the same, but rather checks if they are in the same memory location. For example:
>>> s1 = 'hello everybody'
>>> s2 = 'hello everybody'
>>> s3 = s1
Note the different memory locations:
>>> id(s1)
174699248
>>> id(s2)
174699408
But since s3
is equal to s1
, the memory locations are the same:
>>> id(s3)
174699248
When you use the is
statement:
>>> s1 is s2
False
>>> s3 is s1
True
>>> s3 is s2
False
But if you use the equality operator:
>>> s1 == s2
True
>>> s2 == s3
True
>>> s3 == s1
True
Edit: just to be confusing, there is an optimisation (in CPython anyway, I'm not sure if it exists in other implementations) which allows short strings to be compared with is
:
>>> s4 = 'hello'
>>> s5 = 'hello'
>>> id(s4)
173899104
>>> id(s5)
173899104
>>> s4 is s5
True
Obviously, this is not something you want to rely on. Use the appropriate statement for the job - is
if you want to compare identities, and ==
if you want to compare values.
You want:
algorithm = str(sys.argv[1])
print(algorithm)
print(algorithm == "first")
is
checks for object identity (think memory address).
But in your case the the objects have the same "value", but are not the same objects.
Note that ==
is weaker than is
.
This means that if is
returns True, then ==
will also return True, but the reverse is not always true.
Basically, is
checks object's address (identity), not value,. For value comparison use ==
operator