Dynamic typing means that the type of an object-reference isn't resolved until the program is running, and it needn't be specified up front when the program is written. Take a look at this simple function for adding two objects:
>>> def add(a, b):
... return a + b
...
Nowhere in this definition do we mention any types. We can use add() with integers:
>>> add(5, 7):
12
And we can use it for floats:
>>> add(3.1, 2.4)
5.5
You might be surprised to see that it even works for strings:
>>> add("news", "paper")
'newspaper'
Indeed, this function works for any types, like list, for which the addition operator has been defined:
>>> add([1, 6], [21, 107])
[1, 6, 21, 107]
These examples illustrate the dynamism of the type system: The two arguments, a and b, of the add() function can reference any types of object.