The key is that an object retains its type no matter what you do to it. An int is an int is an int; a str is a str; a float is a float. In a weakly typed language, you can do something like
i = "1"
j = i + 2
and get j == 3. In python, you get
TypeError: cannot concatenate 'str' and 'int' objects
A str is always a str, and can't be treated as an int even if the string contains a number.
Try this:
for a in {1, 'abc', 3.14159}:
print a
print type(a)
which will produce
3.14159
<type 'float'>
1
<type 'int'>
abc
<type 'str'>
A single variable can be set to refer to any type of object - that's the "dynamic" part of it. But the object is always of the same type no matter how you refer to it - that's the "strong" part of it.