Question: I know Python is dynamic typed, duck typed and is also strong. In some cases, we have to make sure it is declare as a list or a dictionary beforehand in order to use them... so can I say Python is also statically typed language?

Answer: 
No, Python is not statically typed.

In static typing names are bound to both a type and an object (or value), in Python names are only bound to objects. At any time you can reassign a name to an object of a different type, which you cannot do in statically typed languages.

I'm not sure what you mean by needing declaring your variables beforehand, but my guess is that you are actually just creating an empty list or dictionary and assigning it to a name.
Consider this line of code:

```
x = [] # (or {})

```

You are not "declaring a variable as a list (or dict)" before using it. You are creating a list (`[]`) (or dict `{}`) and then assigning it as the value of a variable (`x`). This does not mean that `x` now has a type. You could later assign a string to `x`:

```
x = 'a string'

```

and Python would have no problem with this.

I wonder if you are being confused by a feature of another language, such as Perl's autovivification feature, which let's you treat an uninitialized scalar variable as though it were a reference to a list or hash. Are you thinking that Python is less "dynamic" because it lacks such a feature? If you are actually looking for such a thing, look into the defaultdict class from the collections module.