here's fun one. create file foo.py
following contents:
options = {'x': 0} def get_option(key): foo import options return options[key] if __name__ == '__main__': options['x'] = 1 print("options['x'] %d" % options['x']) print("get_option('x') %d" % get_option('x'))
running python foo.py
gives following output:
options['x'] 1 get_option('x') 0
i have expected result 1
in both cases. why 0
in second case?
you getting because from foo import options
line in get_options()
function loads new local options variable in memory value {'x':0}. if remove/comment line, got expected result, because options variable in get_options()
global variable, not local.
options = {'x': 0} def get_option(key): # foo import options return options[key] if __name__ == '__main__': options['x'] = 1 print("options['x'] %d" % options['x']) print("get_option('x') %d" % get_option('x'))
you can debug using id() function returns “identity” of object during it's lifetime.
for debugging code is:
options = {'x': 0} def get_option(key): foo import options print("id %d in get_option" % id(options)) return options[key] if __name__ == '__main__': options['x'] = 1 print("id %d in main" % id(options)) print("options['x'] %d" % options['x']) print("get_option('x') %d" % get_option('x'))
output:
id 140051744576688 in main options['x'] 1 id 140051744604240 in get_option get_option('x') 0
note: values of id's can changed on system.
now, can see id's different in both place, means there 2 options inside get_options()
function 1 __main__.options
, other 1 foo.options
. but, if comment/remove line from foo import options
in get_options()
, same id's @ both places.
Comments
Post a Comment