FAQ: Scope - Modifying Scope Behavior: nonlocal Statement

This community-built FAQ covers the “Modifying Scope Behavior: nonlocal Statement” exercise from the lesson “Scope”.

Paths and Courses
This exercise can be found in the following Codecademy content:

Learn Intermediate Python 3

FAQs on the exercise Modifying Scope Behavior: nonlocal Statement

There are currently no frequently asked questions associated with this exercise – that’s where you come in! You can contribute to this section by offering your own questions, answers, or clarifications on this exercise. Ask or answer a question by clicking reply (reply) below.

If you’ve had an “aha” moment about the concepts, formatting, syntax, or anything else with this exercise, consider sharing those insights! Teaching others and answering their questions is one of the best ways to learn and stay sharp.

Join the Discussion. Help a fellow learner on their journey.

Ask or answer a question about this exercise by clicking reply (reply) below!
You can also find further discussion and get answers to your questions over in Language Help.

Agree with a comment or answer? Like (like) to up-vote the contribution!

Need broader help or resources? Head to Language Help and Tips and Resources. If you are wanting feedback or inspiration for a project, check out Projects.

Looking for motivation to keep learning? Join our wider discussions in Community

Learn more about how to use this guide.

Found a bug? Report it online, or post in Bug Reporting

Have a question about your account or billing? Reach out to our customer support team!

None of the above? Find out where to ask other questions here!

I get that the point of this lesson is to demonstrate how names (a.k.a. variables) are accessible and the objects that they point to can be updated in different scopes of a script. Now that that is out of the way, I can’t help but notice that the example used seems like a terrible code practice: the functions have side-effects, in fact that’s the only point of them. Are there better use cases for accessing and update nonlocal variables?

1 Like

You’re not wrong - these examples are incredibly contrived.

I’m not sure there’s a “best use case” because doing this has kind of an inherent “code smell”. You would typically structure your functions and methods to take the would-be nonlocal variables as parameters, or use OOP and build up classes to encapsulate more complicated state, etc. More generally: you should be designing your code in a way that avoids having to write directly to global / nonlocal variables like this.

Personally, in moments of laziness (or looming deadlines!), I absolutely have used the global or nonlocal keywords to quickly be able to update some higher-up state variable (usually a counter or something) from within a function without having to rewrite a whole bunch of stuff - I suspect, in fact, last minute programming is the most common use case for these keywords and if you find yourself using them extensively, you’re overdue for some refactoring :slight_smile:

4 Likes

Why can calc gallons have access to the nonlocal square_feet in this location. Shouldn’t we need to put it in both, calc_gallons and calc_square_feet()?

code below: ( sorry the snipit does not seem to work on my computer correctly)

walls = [(20, 9), (25, 9), (20, 9), (25, 9)]

def calc_paint_amount(wall_measurements):

square_feet = 0

def calc_square_feet():
nonlocal square_feet
for width, height in wall_measurements:
square_feet += width * height

def calc_gallons():
return square_feet / 400

calc_square_feet()

return calc_gallons()

print('Number of paint gallons needed: ')
print(str(calc_paint_amount(walls)))

calc_gallons doesn’t require the nonlocal keyword in this case because you are not attempting to modify the variable square_feet from the inner function scope, you are only accessing it (reading the value).

calc_square_feet does require the nonlocal keyword because you are modifying/reassigning the square_feet variable from within the enclosed scope.

So to be clear - you only need the keyword when modifying the variable from the inner scope, not if just accessing it.