В вашем источнике только один внутренний объект словаря создается и используется 3 раза.Поэтому, когда вы модифицируете его, вы также увидите изменение 3 раза, потому что все связано с одной и той же переменной.
Вы можете сделать что-то вроде следующего, чтобы решить проблему.Это создаст несколько (key, {})
кортежей и использует их для создания словаря:
colnames = ['name','dob','id']
tablehashcopy = dict((k, {}) for k in colnames)
tablehashcopy['name']['hi'] = 0
print tablehashcopy # use "print(tablehashcopy)" in Python 3
# output: {'dob': {}, 'name': {'hi': 0}, 'id': {}}
Пожалуйста, обратите также внимание на форматирование (без точек с запятой) и некоторые операторы, которые я удалил, потому что они были ненужными.