Yes, they are stored in different addresses so cannot be "equal" objects, which is the Python criteria. As "500" is, and can only be, a string, it is stored in a string address and 500 is stored elsewhere as an integer number.
I'm sorry, but what you are saying is just wrong. The thing on the left hand side of the `is` evalutes not to a string, but a number. `eval` evaluates the string literal "500" into a number 500.
Comments
The reason that `is` doesn't compare to `True` is because `is` does pointer equality, not value equality.