ain references to “external” resources such as open files or windows. It is understood that these resources are freed when the object is garbage-collected, but since garbage collection is not guaranteed to happen, such objects also provide an explicit way to release the external resource, usually a "close()" method. Programs are strongly recommended to explicitly close such objects. The "try"…"finally" statement and the "with" statement provide convenient ways to do this. Some objects contain references to other objects; these are called *containers*. Examples of containers are tuples, lists and dictionaries. The references are part of a container’s value. In most cases, when we talk about the value of a container, we imply the values, not the identities of the contained objects; however, when we talk about the mutability of a container, only the identities of the immediately contained objects are implied. So, if an immutable container (like a tuple) contains a reference to a mutable object, its value changes if that mutable object is changed. Types affect almost all aspects of object behavior. Even the importance of object identity is affected in some sense: for immutable types, operations that compute new values may actually return a reference to any existing object with the same type and value, while for mutable objects this is not allowed. For example, after "a = 1; b = 1", *a* and *b* may or may not refer to the same object with the value one, depending on the implementation. This is because "int" is an immutable type, so the reference to "1" can be reused. This behaviour depends on the implementation used, so should not be relied upon, but is something to be aware of when making use of object identity tests. However, after "c = []; d = []", *c* and *d* are guaranteed to refer to two different, unique, newly created empty lists. (Note that "e = f = []" assigns the *same* object to both *e* and *f*.) z