Here:
curstring = [0]
longest = [0]
you are creating two lists with one element inside, which is an integer (0).
Later, here:
if s[i] >= str(curstring[-1]):
you are checking if a given letter has a higher value than the last element on the list. As Python is zero-based, you start from the letter 'o' (because it has index 1, which happens to be the first one in your range list).
for i in range(1,len(s)):
Char (letter) comparision is based on ASCII table, thus any letter given would have a "higher value" than 0 ('o' is 111).
Because the condition from the second block of code is true, the letter 'o' is added to the list in this block:
curstring+= s[i]
and after that, the list curstring has two elements on it: 0 and 'o'.
if len(curstring) > len(longest):
Here you're comparing curstring (described above) and longest which is a list with one element in it: 0 (as you created the list with one element in the first block of code described above). The condition is true (2 elements is more than one element), so longest now points to the same list as curstring and thus has two elements (and the length = 2).
Later on, as you can see in the visualiser you provided, the curstring reference variable doesn't point to the list. It's type is changed when this line is executed:
curstring = s[i]
so later, when a char is added, when the 15. step is executed it turns out to be a two letter string "dw". That string is compared with the list longest with two elements (which was described above). The String "dw" is of length 2 and the list is of length 2, that's why the condition is false.
You should read a bit about types in Python and how the variables are created and maintained in the code - it would help you to catch those small mistakes. Bear in mind that Python has a different syntax when it comes to lists than languages like C++ or Java - I assume that you have written that code
curstring = [0]
longest = [0]
based on experiance with arrays/lists in other languages. Empty list in Python is created like this:
new_list = []