On 14/11/2019 17:11, R.Wieser wrote:
Rhodri,

MyVar is a global here, so nonlocal explicitly doesn't pick it up.
I do not agree with you there (the variable being global).  If it where than
I would have been able to alter the variable inside the procedure without
having to resort to a "global" override (an override which is only valid for
the context its used in by the way, not anywhere else)

Than again, that is how it works in a few other languages, so I might have
been poisonned by them.:-)

You have been.

  # This is at the top level of a module
  # I.e. it's a global variable
  my_global_variable = 5

  # You can read globals from within a function without declaring them
  def show_my_global():
    print(my_global_variable)

  # If you try setting it, you get a local instead
  def fudge_my_global(n):
    my_global_variable = n

  show_my_global()  # prints '5'
  fudge_my_global(2)
  show_my_global()  # prints '5'

  # If you read the variable before setting it, you get an exception
  def mess_up_my_global(n):
    print(my_global_variable)
    my_global_variable = n

  mess_up_my_global(2) # UnboundLocalError!

  # ...because it must be a local because of the assignment, but it
  # doesn't have a value at the time print() is called.

  # To do it right, declare you want the global from the get go
  def love_my_global(n):
    global my_global_variable
    print("It was ", my_global_variable)
    my_global_variable = n

  love_my_global(3) # prints 'It was 5'
  show_my_global()  # prints '3'

--
Rhodri James *-* Kynesim Ltd
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to