It really depends on what you mean by "a reference". ...and it also depends on what you're going to do with the reference. eg.
class Test(object):
def __init__(self):
self.__observers = {'event1': {'test':'this'}, 'event2': {'test':'that'}}
def get_observers(self):
return self.__observers
def my_function(self, event):
observer_ref = self.__observers[event]
return observer_ref
if __name__ == '__main__':
t = Test()
my_event = 'event1'
print('From class: {}'.format(t.get_observers()[my_event]))
my_ref = t.my_function(my_event)
print('From my_function: {}'.format(my_ref))
my_ref['something'] = 'else'
print('From my_function after addition: {}'.format(my_ref))
print('From class after addition: {}'.format(t.get_observers()[my_event]))
my_ref = 'something else entirely'
print('From my_function after re-assignment: {}'.format(my_ref))
print('From class after re-assignment: {}'.format(t.get_observers()[my_event]))
Results in :
From class: {'test': 'this'}
From my_function: {'test': 'this'}
From my_function after addition: {'test': 'this', 'something': 'else'}
From class after addition: {'test': 'this', 'something': 'else'}
From my_function after re-assignment: something else entirely
From class after re-assignment: {'test': 'this', 'something': 'else'}
Basically, if your reference
is to an object of some sort, you can use that reference to manipulate that object. You just can't re-assign the name of the reference to something else and have it reflected back in the original object you pulled your reference from.