A python Hang Man Game
I can make some general suggestions. Having code completely rewritten is offtopic here though.



In play_game, you import random from within the function. PEP8 notes though that:


  Imports are always put at the top of the file, just after any module comments and docstrings, and before module globals and constants.


It's conceivable that you may want to have an import conditionally happen inside of a function if the import is expensive, and would only rarely be used. That certainly isn't the case here though.



changed_list = [char for char in changed_word]


This just creates a copy of changed_word in a verbose way. You would be better off doing what you did before:

changed_list = changed_word[:]




You use far too many global variables. For clarity, those variables making up the state of the game should be explicitly passed to each function that needs them. You could use a dataclass to hold the data, and then pass the state object around.

Having everything as global with complicate testing, and makes your program harder to understand.



You have a loop that's written in a confusing way:

while True:
    guess = input("Input a letter: ")
    if len(guess) != 1:
        print("You should print a single letter\n")
        continue
    if guess != guess.lower() or not guess.isalpha():
        print("It is not an ASCII lowercase letter\n")
        continue
    break


You continue in two branches, then break at the bottom. You might as well just use an elif and else to set it up so you only break if both checks were false:

while True:
    guess = input("Input a letter: ")
    if len(guess) != 1:
        print("You should print a single letter\n")
    elif guess != guess.lower() or not guess.isalpha():
        print("It is not an ASCII lowercase letter\n")
    else:
        break




"\n%s\nYou guessed the word!\nYou survived!" % hidden_word


In more modern Python, this can be written more cleanly using f-strings like you use later:

f"\n{hidden_word}\nYou guessed the word!\nYou survived!"




if setting == "check_lives":
    if lives != 0:
        if lives &lt; 5: # HINT CONDITION
            if hint_flag:


You don't have an else case for any of those checks, so you might as well just and them:

if setting == "check_lives" and 0 &lt; lives &lt; 5 and hint_flag:


That will cut down on a lot of nesting.



list((len(chosen_word))*"-")


Would make a lot more sense as just:

len("chosen_word") * ["-"]




for _ in range(len(changed_list)):
    guess = changed_list[_]


Don't call something _ unless you don't use it. If you use it, give it a good, descriptive name. Here though, you should just iterate the word directly:

for letter in changed_list:
    guess = letter  # Which mostly gets rid of the need for guess