Why I have to do a deepcopy to the argument?

Dimitris Leventeas mydimle at gmail.com
Wed Jun 16 05:08:51 EDT 2010


Thanks Thomas!

To reply the subject's question:  I don't have to. The following works 
perfectly.


def populate_trie(trie, sequence, position=None):
    """ 
    Populate a trie.

    Assume that the counter is always at `position` 0 while the `position`
    of the dictionary is the last one.
    
    >>> trie = {}
    >>> populate_trie(trie, 'taspython')
    {'t': {'a': {'s': {'p': {'y': {'t': {'h': {'o': {'n': {}}}}}}}}}}
    >>> trie = {}
    >>> populate_trie(trie, 'kalo', 1)
    {'k': [1, {'a': [1, {'l': [1, {'o': [1, {}]}]}]}]}
    >>> trie = {}
    >>> populate_trie(trie, 'heh', 2)
    {'h': [1, 0, {'e': [1, 0, {'h': [1, 0, {}]}]}]}
    >>> trie = {}
    >>> trie = populate_trie(trie, 'heh', 1)
    >>> populate_trie(trie, 'hah', 1)
    {'h': [2, {'a': [1, {'h': [1, {}]}], 'e': [1, {'h': [1, {}]}]}]}
    
        
    """
    
    if (position is not None) and (position >= 1):
        embedded_obj = [0] * position
        embedded_obj.append({})
    else:
        embedded_obj = {}
    
    d2 = trie
    for i, character in enumerate(sequence):
        d2 = access_trie(trie, sequence[:i], position)
        if character not in d2:
            if position is None:
                d2[character] = deepcopy(embedded_obj)
            else:
                d2[character] = d2.get(character, deepcopy(embedded_obj))
                d2[character][0] += 1
        elif position is not None:
            d2[character][0] += 1

    return trie


Best regards,
Dimitris Leventeas
-- 
Dimitris Leventeas
http://students.ceid.upatras.gr/~lebenteas/



More information about the Python-list mailing list