forked from rsokl/Learning_Python
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathScope.html
More file actions
385 lines (254 loc) · 20 KB
/
Copy pathScope.html
File metadata and controls
385 lines (254 loc) · 20 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta content="Topic: variable score and namespaces in python, Difficulty: Medium, Category: Section" name="description" />
<meta content="variable, namespace, function, scope, shadowing" name="keywords" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Scope — Python Like You Mean It</title>
<script type="text/javascript" src="../_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/language_data.js"></script>
<script src="https://www.googletagmanager.com/gtag/js?id=UA-115029372-1"></script>
<script src="../_static/gtag.js"></script>
<script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
<script async="async" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
<script type="text/x-mathjax-config">MathJax.Hub.Config({"tex2jax": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true, "ignoreClass": "document", "processClass": "math|output_area"}})</script>
<script type="text/javascript" src="../_static/js/theme.js"></script>
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../_static/my_theme.css" type="text/css" />
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="Data Structures (Part I): Introduction" href="DataStructures.html" />
<link rel="prev" title="Basics of Functions" href="Functions.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../index.html" class="icon icon-home"> Python Like You Mean It
</a>
<div class="version">
1.4
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">Table of Contents:</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../intro.html">Python Like You Mean It</a></li>
<li class="toctree-l1"><a class="reference internal" href="../module_1.html">Module 1: Getting Started with Python</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../module_2.html">Module 2: The Essentials of Python</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="Basic_Objects.html">Basic Object Types</a></li>
<li class="toctree-l2"><a class="reference internal" href="SequenceTypes.html">Sequence Types</a></li>
<li class="toctree-l2"><a class="reference internal" href="Variables_and_Assignment.html">Variables & Assignment</a></li>
<li class="toctree-l2"><a class="reference internal" href="Introduction.html">Introducing Control Flow</a></li>
<li class="toctree-l2"><a class="reference internal" href="ConditionalStatements.html">Conditional Statements</a></li>
<li class="toctree-l2"><a class="reference internal" href="ForLoops.html">For-Loops and While-Loops</a></li>
<li class="toctree-l2"><a class="reference internal" href="Iterables.html">Iterables</a></li>
<li class="toctree-l2"><a class="reference internal" href="Generators_and_Comprehensions.html">Generators & Comprehension Expressions</a></li>
<li class="toctree-l2"><a class="reference internal" href="Itertools.html">Python’s “Itertools”</a></li>
<li class="toctree-l2"><a class="reference internal" href="Functions.html">Basics of Functions</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">Scope</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#Variable-Shadowing">Variable Shadowing</a></li>
<li class="toctree-l3"><a class="reference internal" href="#Links-to-Official-Documentation">Links to Official Documentation</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="DataStructures.html">Data Structures (Part I): Introduction</a></li>
<li class="toctree-l2"><a class="reference internal" href="DataStructures_II_Dictionaries.html">Data Structures (Part II): Dictionaries</a></li>
<li class="toctree-l2"><a class="reference internal" href="DataStructures_III_Sets_and_More.html">Data Structures (Part III): Sets & the Collections Module</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../module_2_problems.html">Module 2: Problems</a></li>
<li class="toctree-l1"><a class="reference internal" href="../module_3.html">Module 3: The Essentials of NumPy</a></li>
<li class="toctree-l1"><a class="reference internal" href="../module_3_problems.html">Module 3: Problems</a></li>
<li class="toctree-l1"><a class="reference internal" href="../module_4.html">Module 4: Object Oriented Programming</a></li>
<li class="toctree-l1"><a class="reference internal" href="../module_5.html">Module 5: Odds and Ends</a></li>
<li class="toctree-l1"><a class="reference internal" href="../changes.html">Changelog</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../index.html">Python Like You Mean It</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../index.html">Docs</a> »</li>
<li><a href="../module_2.html">Module 2: The Essentials of Python</a> »</li>
<li>Scope</li>
<li class="wy-breadcrumbs-aside">
<a href="../_sources/Module2_EssentialsOfPython/Scope.md.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<style>
/* CSS overrides for sphinx_rtd_theme */
/* 24px margin */
.nbinput.nblast.container,
.nboutput.nblast.container {
margin-bottom: 19px; /* padding has already 5px */
}
/* ... except between code cells! */
.nblast.container + .nbinput.container {
margin-top: -19px;
}
.admonition > p:before {
margin-right: 4px; /* make room for the exclamation icon */
}
/* Fix math alignment, see https://github.com/rtfd/sphinx_rtd_theme/pull/686 */
.math {
text-align: unset;
}
</style>
<div class="section" id="Scope">
<h1>Scope<a class="headerlink" href="#Scope" title="Permalink to this headline">¶</a></h1>
<p>A valuable aspect of the “encapsulation” provided by functions is that the function’s input argument variables, and any variables defined within the function, cannot be “seen” nor accessed outside of the function. That is, these variables are said to have a restricted <strong>scope</strong>.</p>
<div class="admonition note">
<p class="admonition-title fa fa-exclamation-circle"><strong>Definition</strong>:</p>
<p>The <strong>scope</strong> of a variable refers to the context in which that variable is visible/accessible to the Python interpreter.</p>
</div>
<p>Until our work with comprehension-statements and functions, we had only encountered variables that have <strong>file scope</strong>. This means that a variable, once defined, is visible to all parts of the code contained in the same file. Variables with file scope can even be accessed <em>within functions</em>. By contrast, the variables defined within a function or as input arguments to a function have a <strong>restricted scope</strong> - they can only be accessed within the context of the function:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">x</span> <span class="o">=</span> <span class="mi">3</span> <span class="c1"># `x` has file scope. It can be even be accessed</span>
<span class="c1"># within a function, even if it isn't passed to</span>
<span class="c1"># the function as an argument</span>
<span class="c1"># `my_func` has file scope (after it is defined)</span>
<span class="k">def</span> <span class="nf">my_func</span><span class="p">(</span><span class="n">y</span><span class="p">):</span>
<span class="n">func_var</span> <span class="o">=</span> <span class="mi">9</span> <span class="o">+</span> <span class="n">x</span> <span class="c1"># `x` will have the value 3</span>
<span class="c1"># the scope of `y` and `func_var` is restricted to this function</span>
<span class="k">return</span> <span class="n">y</span>
<span class="c1"># `func_var` and `y` do not exist here</span>
<span class="nb">print</span><span class="p">(</span><span class="n">func_var</span><span class="p">)</span> <span class="c1"># raises NameError: name `func_var` not defined</span>
<span class="nb">print</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> <span class="c1"># raises NameError: name `y` not defined</span>
</pre></div>
</div>
<p>Python’s scoping rules are quite liberal compared to those of other languages, like C++. In most situations, Python will give variables file scope. Let’s briefly survey the various contexts in which variables are defined, along with their corresponding scoping rules. Assume that the following code represents the entire contents of the Python script “example_scope.py”:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># this demonstrates scope of variables in different contexts</span>
<span class="c1"># nothing meaningful is computed in this file</span>
<span class="kn">from</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="n">combinations</span> <span class="c1"># `combinations` has file scope</span>
<span class="c1"># `my_func` has file scope</span>
<span class="c1"># `in_arg1` has restricted scope</span>
<span class="c1"># `in_arg2` has restricted scope</span>
<span class="c1"># `func_block` has restricted scope</span>
<span class="k">def</span> <span class="nf">my_func</span><span class="p">(</span><span class="n">in_arg1</span><span class="p">,</span> <span class="n">in_arg2</span><span class="o">=</span><span class="s2">"cat"</span><span class="p">):</span>
<span class="n">func_block</span> <span class="o">=</span> <span class="mi">1</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="c1"># `file_var` has file scope</span>
<span class="c1"># `comp_var` has restricted scope</span>
<span class="n">file_var</span> <span class="o">=</span> <span class="p">[</span><span class="n">comp_var</span><span class="o">**</span><span class="mi">2</span> <span class="k">for</span> <span class="n">comp_var</span> <span class="ow">in</span> <span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">2</span><span class="p">]]</span>
<span class="c1"># `if_block` has file scope</span>
<span class="k">if</span> <span class="kc">True</span><span class="p">:</span>
<span class="n">if_block</span> <span class="o">=</span> <span class="mi">2</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">if_block</span> <span class="o">=</span> <span class="mi">3</span>
<span class="c1"># `it_var` has file scope</span>
<span class="c1"># `for_block` has file scope</span>
<span class="k">for</span> <span class="n">it_var</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]:</span>
<span class="n">for_block</span> <span class="o">=</span> <span class="mi">1</span>
<span class="c1"># `while_block` has file scope</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="n">while_block</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">break</span>
</pre></div>
</div>
<p>In the preceding code, the following variables have <em>file scope</em>:</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">combinations</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">my_func</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">file_var</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">if_block</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">it_var</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">for_block</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">while_block</span></code></p></li>
</ul>
<p>whereas the following variables have <em>restricted scope</em>:</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">in_arg1</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">in_arg2</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">func_block</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">comp_var</span></code></p></li>
</ul>
<p>In C++, the variables <code class="docutils literal notranslate"><span class="pre">if_block</span></code>, <code class="docutils literal notranslate"><span class="pre">it_var</span></code>, <code class="docutils literal notranslate"><span class="pre">for_block</span></code>, and <code class="docutils literal notranslate"><span class="pre">while_block</span></code> all would have had restricted scopes - these variables would not be defined outside of their respective if/for/while blocks.</p>
<div class="admonition note">
<p class="admonition-title fa fa-exclamation-circle"><strong>Takeaway</strong>:</p>
<p>Variables defined within a function have a <em>restricted scope</em> such that they do not exist outside of that function. Most other contexts for defining variables in Python produce variables with <em>file scope</em> (i.e. they can be accessed anywhere in the file’s code, subsequent to their definition).</p>
</div>
<div class="section" id="Variable-Shadowing">
<h2>Variable Shadowing<a class="headerlink" href="#Variable-Shadowing" title="Permalink to this headline">¶</a></h2>
<p>What happens when a file-scope variable and a function-scope variable share the same name? This type of circumstance is known as <strong>variable shadowing</strong>. Python resolves this by giving precedence to the variable <em>with the most restricted scope</em>, when inside that scope:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">x</span> <span class="o">=</span> <span class="mi">2</span>
<span class="n">y</span> <span class="o">=</span> <span class="mi">3</span>
<span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
<span class="c1"># input-arg `x` overrides file-scope version of `x`</span>
<span class="n">y</span> <span class="o">=</span> <span class="mi">5</span> <span class="c1"># overrides file-scope version of `y`</span>
<span class="k">return</span> <span class="n">x</span> <span class="o">+</span> <span class="n">y</span>
<span class="c1"># `x` is 2 here, once again</span>
<span class="c1"># `y` is 3 here, once again</span>
<span class="nb">print</span><span class="p">(</span><span class="n">func</span><span class="p">(</span><span class="o">-</span><span class="mi">5</span><span class="p">))</span> <span class="c1"># prints 0</span>
<span class="nb">print</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span> <span class="c1"># prints 2 3</span>
</pre></div>
</div>
<p>and similarly,</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">it</span> <span class="o">=</span> <span class="s2">"cow"</span>
<span class="k">def</span> <span class="nf">func</span><span class="p">():</span>
<span class="n">it</span> <span class="o">=</span> <span class="s2">"dog"</span> <span class="c1"># overrides file-scope version of `it`</span>
<span class="n">my_list</span> <span class="o">=</span> <span class="p">[</span><span class="n">it</span><span class="o">**</span><span class="mi">2</span> <span class="k">for</span> <span class="n">it</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]]</span> <span class="c1"># within the list comprehension, the func-scope `it` is overridden</span>
<span class="c1"># `it` is "dog" here, once again</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="c1"># `it` is "cow" here, once again</span>
</pre></div>
</div>
</div>
<div class="section" id="Links-to-Official-Documentation">
<h2>Links to Official Documentation<a class="headerlink" href="#Links-to-Official-Documentation" title="Permalink to this headline">¶</a></h2>
<ul class="simple">
<li><p><a class="reference external" href="https://docs.python.org/3/tutorial/classes.html#python-scopes-and-namespaces">Scopes and namespaces</a></p></li>
<li><p><a class="reference external" href="https://docs.python.org/3/reference/executionmodel.html">Python’s execution model</a></p></li>
</ul>
</div>
</div>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="DataStructures.html" class="btn btn-neutral float-right" title="Data Structures (Part I): Introduction" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
<a href="Functions.html" class="btn btn-neutral float-left" title="Basics of Functions" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<p>
© Copyright 2019, Ryan Soklaski
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>