There are some thing you can do with dynamically typed variables that don't work nicely with statically typed variables though. For example, a statically typed languages needs to know the expected type of a variable at compile time. While this often makes sense, things get muddy when you work with inheritance.
For example, if you've got a class Rectangle and a class Triangle that inherit from Shape, then there may be cases when you don't know and don't really care if something is a Triangle or a Rectangle at compile time. A statically typed language however forces you to give the variable the Shape type in that case. But then the object will be treated as a Shape, unless you explicitly cast it to a Rectangle or Triangle, so even though both types have a draw function, you can't call the draw function and get the desired result without an explicit cast, because you'll get the Draw function of the Shape class instead. In a dynamically typed language the behavior of Draw will be exactly what you expect it to be.
Note that ML dialects solve this problem by inferring the type of a variable from it's first assignment. This prevents all kinds of errors from (un)intentional misuse of dynamic typing, but it also forbids legitimate use, like, in the previous example, swapping a Rectangle for a Triangle.
Also, on the topic of Python, it's nice that they provide Lists as a core feature of the language, but why did they have to omit arrays/vectors? Access into an array or a vector is O(1) when you know where you have to be, while it's O(n) for a list...