title: `del` on a package has some kind of memory
body: <p><code>del</code> seems to have some memory which puzzles me. See the following:</p>
  
  <pre><code>In [1]: import math
  
  In [2]: math.cos(0)
  Out[2]: 1.0
  
  In [3]: del math.cos
  
  In [4]: math.cos(0)
  ---------------------------------------------------------------------------
  AttributeError                            Traceback (most recent call last)
  &lt;ipython-input-4-9cdcc157d079&gt; in &lt;module&gt;()
  ----&gt; 1 math.cos(0)
  
  AttributeError: module 'math' has no attribute 'cos'
  </code></pre>
  
  <p>Fine. Let's see what happens if we delete the whole math package:</p>
  
  <pre><code>In [5]: del math
  
  In [6]: math.cos(0)
  ---------------------------------------------------------------------------
  NameError                                 Traceback (most recent call last)
  &lt;ipython-input-6-9cdcc157d079&gt; in &lt;module&gt;()
  ----&gt; 1 math.cos(0)
  
  NameError: name 'math' is not defined
  </code></pre>
  
  <p>So now math itself is gone, as expected. </p>
  
  <p>Now let's import math again:</p>
  
  <pre><code>In [7]: import math
  
  In [8]: math.cos(0)
  ---------------------------------------------------------------------------
  AttributeError                            Traceback (most recent call last)
  &lt;ipython-input-8-9cdcc157d079&gt; in &lt;module&gt;()
  ----&gt; 1 math.cos(0)
  
  AttributeError: module 'math' has no attribute 'cos'
  </code></pre>
  
  <p>So somehow interactive python remembers that math.cos was deleted specifically even after we deleted the whole math package and imported it again.</p>
  
  <p>Where does python keeps this knowledge? Can we access it? Can we change it?</p>