Lecture 10 Memory in Python
Announcements For This Lecture Assignment 1 More Assignments • Assignment 2 TONIGHT • Work on your revisions § Scan and submit online § Read feedback carefully § Upload before midnight § Want done by tomorrow § Late: -10% per day § Partial credit after Wed. § No lates after THURS • Survey : 676 responded • Assignment 3 is posted § Deadline is tomorrow § Due week from Friday § Avg Time : 6.5 hours! § Before you go on Fall Break § STD Dev : 3.6 hours § Graded when you get back 10/1/19 Memory in Python 2
The Three “Areas” of Memory The Heap Global Space Call Stack 10/1/19 Memory in Python 3
Global Space • This is the area you “start with” § First memory area you learned to visualize § A place to store “global variables” § Lasts until you quit Python p id2 • What are global variables ? § Any assignment not in a function definition § Also modules & functions! § Will see more on this in a bit 10/1/19 Memory in Python 4
The Call Stack • The area where call frames live § Call frames are created on a function call § May be several frames (functions call functions) § Each frame deleted as the call completes • Area of volatile, temporary memory incr_x 2 § Less permanent than global space § Think of as “scratch” space q id2 • Primary focus of Assignment 2 10/1/19 Memory in Python 5
Heap Space or “The Heap” • Where the “folders” live § Stores only folders id2 • Can only access indirectly Point3 § Must have a variable with identifier § Can be in global space, call stack 0.0 x • MUST have variable with id 0.0 y § If no variable has id, it is forgotten 0.0 z § Disappears in Tutor immediately § But not necessarily in practice § Role of the garbage collector 10/1/19 Memory in Python 6
Everything is an Object! • Last time we saw that everything is an object § Must have a folder in the heap § Must have variable in global space, call stack § But ignore basic types ( int , float , bool , str ) • Includes modules and function definitions ! § Object is created by import § Object is created by def § Already seen this in Python Tutor 10/1/19 Memory in Python 7
Modules and Global Space import math • Importing a module: § Creates a global variable Global Space (same name as module) math id5 Heap Space § Puts contents in a folder id5 • Module variables module • Module functions 3.141592 pi § Puts folder id in variable 2.718281 e • from keyword dumps functions contents to global space 10/1/19 Memory in Python 8
Modules vs Objects Module Object math id2 p id3 id2 id3 module Point3 5.0 x 3.141592 pi 2.0 y 2.718281 e 3.0 z math.pi p.x functions math.cos(1) p.clamp(-1,1) 10/1/19 Memory in Python 9
Modules vs Objects Module Object math id2 p id3 id2 id3 The period (.) means module Point3 “go inside of the folder” 5.0 x 3.141592 pi 2.0 y 2.718281 e 3.0 z math.pi p.x functions math.cos(1) p.clamp(-1,1) 10/1/19 Memory in Python 10
So Why Have Both? • Question is a matter of program design § Some software will use modules like objects • Classes can have many instances § Infinitely many objects for the Point3 class § Reason we need a constructor function • Each module is a unique instance § Only one possibility for pi , cosine § That is why we import them § Sometimes refer to as singleton objects 10/1/19 Memory in Python 11
So Why Have Both? • Question is a matter of program design § Some software will use modules like objects • Classes can have many instances c i p o § Infinitely many objects for the Point3 class t d e c n a v d a n a e s s i r u e o c § Reason we need a constructor function i c o s h i C h t f o e p o c s d n o y e b • Each module is a unique instance § Only one possibility for pi , cosine § That is why we import them § Sometimes refer to as singleton objects 10/1/19 Memory in Python 12
How About import * ? Ouch! 10/1/19 Memory in Python 13
Functions and Global Space • A function definition … def to_centigrade(x): Body § Creates a global variable return 5*(x-32)/9.0 (same name as function) Global Space § Creates a folder for body to_centigrade id6 § Puts folder id in variable • Variable vs. Call Heap Space >>> to_centigrade id6 <fun to_centigrade at 0x100498de8> function >>> to_centigrade (32) Body 0.0 10/1/19 Memory in Python 14
Working with Function Variables • So function definitions are objects § Function names are just variables § Variable refers to a folder storing the code § If you reassign the variable, it is lost • You can assign them to other variables § Variable now refers to that function § You can use that NEW variable to call it § Just use variable in place of function name 10/1/19 Memory in Python 15
Example: add_one Frame remembers the original name 10/1/19 Memory in Python 16
Example: add_one c i p o t d e c n a v d a n a e s s r i u e o g c a s s U i h t f o e p o c s d n o y e b Frame remembers the original name 10/1/19 Memory in Python 17
Why Show All This? • Many of these are advanced topics § Only advanced programmers need § Will never need in the context of 1110 • But you might use them by accident • Goal: Teach you to read error messages § Need to understand what messages say § Only way to debug your own code § This means understanding the call stack 10/1/19 Memory in Python 18
Recall: Call Frames Call : to_centigrade(50.0) 1. Draw a frame for the call 2. Assign the argument value to_centigrade 1 to the parameter (in frame) 3. Execute the function body x 50.0 § Look for variables in the frame § If not there, look for global variables with that name 4. Erase the frame for the call def to_centigrade(x): return 5*(x-32)/9.0 1 10/1/19 Memory in Python 19
Aside: What Happens Each Frame Step? • The instruction counter always changes • The contents only change if § You add a new variable § You change an existing variable § You delete a variable • If a variable refers to a mutable object § The contents of the folder might change 10/1/19 Memory in Python 20
Recall: Call Frames Call : to_centigrade(50.0) 1. Draw a frame for the call 2. Assign the argument value to_centigrade 1 to the parameter (in frame) 3. Execute the function body x 50.0 § Look for variables in the frame § If not there, look for global variables with that name 4. Erase the frame for the call What is happening here? def to_centigrade(x): return 5*(x-32)/9.0 1 10/1/19 Memory in Python 21
Function Access to Global Space • Consider code to right Global Space a 4 (for globals.py) § Global variable a § Function definition get_a get_a 6 • Consider the call get_a() § Call frame to the right § What happens? # globals.py """Show how globals work""" A: It crashes a = 4 # global space B: Returns None C: Returns 4 def get_a(): D: I don’t know return a 10/1/19 Memory in Python 22
Function Access to Global Space • Consider code to right Global Space a 4 (for globals.py) § Global variable a § Function definition get_a get_a 6 • Consider the call get_a() § Call frame to the right § What happens? # globals.py """Show how globals work""" A: It crashes a = 4 # global space B: Returns None C: Returns 4 CORRECT def get_a(): D: I don’t know return a 10/1/19 Memory in Python 23
Function Access to Global Space • All function definitions Global Space a 4 (for globals.py) are in some module • Call can access global get_a 6 space for that module § math.cos : global for math § temperature.to_centigrade # globals.py uses global for temperature """Show how globals work""" • But cannot change values a = 4 # global space § Makes a new local variable ! def get_a(): § Why we limit to constants return a 10/1/19 Memory in Python 24
Function Access to Global Space • All function definitions Global Space a 4 (for globals.py) are in some module • Call can access global change_a space for that module a 3.5 § math.cos : global for math § temperature.to_centigrade # globals.py uses global for temperature """Show how globals work""" • But cannot change values a = 4 # global space § Makes a new local variable ! def change_a(): § Why we limit to constants a = 3.5 # local variable 10/1/19 Memory in Python 25
Frames and Helper Functions Call: last_name_first('Walker White'): 1. def last_name_first(s): """ Precond : s in the form 2. last_name_first 4 3. 'first-name last-name' """ s 'Walker White' 4. first = first_name(s) 5. last = last_name(s) 6. return last + ',' + first 7. 8. def first_name(s): """ Precond : see above""" 9. 10. end = s.find(' ') 11. return s[0:end] 10/1/19 Memory in Python 26
Recommend
More recommend