No, `$post_id` is not a global variable. You can see a list of global variables WordPress creates here: https://codex.wordpress.org/Global_Variables

`$post_id` is just a common naming convention for a variable that contains a post ID. In tutorials and example code it shows that the value is expected to be a post ID, but you still need to have set its value somewhere else in the code.

If you are inside [The Loop][1] you can get the ID of the current page or post in the loop with `$post_id = get_the_ID()`. If you are outside The Loop and want to get the ID of the currently queried post or page you can use `$post_id = get_queried_object_id()`.

Another way you might get a post ID is in a hook callback. For example, in the [`post_thumbnail_size`][2] hook the callback receives a post ID as the 2nd argument:

    function wpse_299132_post_thumbnail_size( $size, $post_id ) {
        return $size;
    }
    add_filter( 'wpse_299132_post_thumbnail_size', 'wpse_299132_post_thumbnail_size', 10, 2 );

But that's just the name used in the documentation to make it clear what the variable contains. You can call it anything you like. This is also valid, for example:

    function wpse_299132_post_thumbnail_size( $size, $myPostId ) {
        return $size;
    }
    add_filter( 'wpse_299132_post_thumbnail_size', 'wpse_299132_post_thumbnail_size', 10, 2 );

`$myPostId` is the 2nd argument, so will contain a post ID. But what you call it doesn't matter.

  [1]: https://developer.wordpress.org/themes/basics/the-loop/
  [2]: https://developer.wordpress.org/reference/hooks/post_thumbnail_size/