Python does type inference during execution time. As j has pointed out Python is a dynamically typed language; meaning you don't have to specify the type of a variable during its declaration.
Python has typed objects, though; but even after the fact, Python does what is called duck typing. What this means is, an object doesn't have to be of a certain type — during compile time — when one is trying to call a method on that object. If any type errors happen, they are reflected during run time.
If it looks like a duck, it quacks like a duck, it is a duck.
In the above regard, contrary to what j has pointed out; Python is not a weakly-typed language; in fact it is a strongly typed language; meaning that you cannot do operations on two objects that are of different types (in contrast to what you can do in JavaScript, "x" + 5 will fail in Python)
When someone mentions, a strongly-typed language; more often than not, that language also turns out to be a statically typed language. Python would be an odd one out here — being a dynamically typed language, it is also a strongly typed one.