list comprehension problem

Gary Herron gherron at islandtraining.com
Thu Oct 29 16:28:06 CET 2009


mk wrote:
> Hello everyone,
>
> print hosts
> hosts = [ s.strip() for s in hosts if s is not '' and s is not None 
> and s is not '\n' ]
> print hosts
>
> ['9.156.44.227\n', '9.156.46.34 \n', '\n']
> ['9.156.44.227', '9.156.46.34', '']
>
> Why does the hosts list after list comprehension still contain '' in 
> last position?
>
> I checked that:
>
> print hosts
> hosts = [ s.strip() for s in hosts if s != '' and s != None and s != 
> '\n' ]
> print hosts
>
> ..works as expected:
>
> ['9.156.44.227\n', '9.156.46.34 \n', '\n']
> ['9.156.44.227', '9.156.46.34']
>
>
> Are there two '\n' strings in the interpreter's memory or smth so the 
> identity check "s is not '\n'" does not work as expected?
>
> This is weird. I expected that at all times there is only one '\n' 
> string in Python's cache or whatever that all labels meant by the 
> programmer as '\n' string actually point to. Is that wrong assumption?


Clearly.  And even if you do figure out what the internals really are 
doing, it is foolish to write a program that depends on them -- there is 
no guarantee that such implementation specific behavior will be 
consistent over other implementations.

Conclusion:  Don't use "is" for comparison when you mean to check for 
equality.  And you do want an equality check here. 

Gary Herron




>
>
>
> Regards,
> mk
>




More information about the Python-list mailing list