Python's hasattr on list values of dictionaries always returns false?

hasattr does not test for members of a dictionary. Use the in operator instead, or the .has_key method:

>>> example = dict(foo='bar')
>>> 'foo' in example
True
>>> example.has_key('foo')
True
>>> 'baz' in example
False

But note that dict.has_key() has been deprecated, is recommended against by the PEP 8 style guide and has been removed altogether in Python 3.

Incidentally, you'll run into problems by using a mutable class variable:

>>> class example(object):
...     foo = dict()
...
>>> A = example()
>>> B = example()
>>> A.foo['bar'] = 'baz'
>>> B.foo
{'bar': 'baz'}

Initialize it in your __init__ instead:

class State(object):
    info = None

    def __init__(self):
        self.info = {}

A dictionary key is not the same as an object attribute

thing1 = {'a', 123}
hasattr(thing1, 'a') # False
class c: pass
thing2 = c()
thing2.a = 123
hasattr(thing2, 'a') # True

To test for elements in a list/dictionary, use in. To use defaults, you can use dict.get:

def add_to_info(self, key_string, integer):
    array = self.info.get(key_string, [])
    array.append(integer)
    self.info[key_string] = array

Or use defaultdict:

from collections import defaultdict
class State(object):
    info = defaultdict(list)

    def add_to_info(self, key_string, integer):
        self.info[key_string].append(integer)