In essence, for all technical purposes,

    get_post() == $post == $GLOBALS['post']

As @tosho already explained in the [linked post](http://wordpress.stackexchange.com/questions/73403/using-global-post-v-s-globalspost), `$post === $GLOBALS['post']`, so I will not go into that. 

What we are interested in is, how is `get_post()` the same. For this, we will need to look at the [source code](https://developer.wordpress.org/reference/functions/get_post/). As you can see, we get our answer in the first two lines of the function when we do not pass anything to `get_post()`

    if ( empty( $post ) && isset( $GLOBALS['post'] ) )
        $post = $GLOBALS['post'];

> regarding the `if ( isset( $GLOBALS['post'] ) ):` I guess this means post can be undefined. 
 
Yes, it can, and it depends on context. Also, just like any global, it can be unset as well, delibritely or unknowingly which can have disasterous effects. That is what make globals such a nasty evil thing to create and use. Unknowingly using globals as local variables is the number one reason (*IMO*) for unexpected, non debuggable code failures. 

The `$post` global is set by `WP_Query::the_post()`, but it can be changes by any custom code, so never rely on that, specially outside of the loop.


> is it safe to assume that the widget code being executed after the loop

**NEVER EVER** assume anything. That is the most dangerous thing you can ever do when coding. Simply assuming something leads to terrible bugs, security loopholes, maybe leak very personal info which can land you in jail, etc etc. Treat everything you code in such a manner to safely handle a specific thing or behavior should something fail, and alwyas code with a mindset that your code will fail and it will be hacked. 

Again, widgets can run before the loop or after it, and even inside the loop, so do not assume it will behave in a certain manner.

If this is a true page (*created in the back end pages section*), then you can use `get_queried_object()` to get the current page object. It is much more reliable than the `$post` global. You should take your time and read through [this answer by @gmazzap](http://wordpress.stackexchange.com/a/167735/31545) to [my question here](http://wordpress.stackexchange.com/q/167706/31545)