title: Local variable might be referenced before assignment - Python
body: <p>I've been trying to make an encryption and decryption system but I have run into a small error. Here is my code:</p>
  
  <pre><code>    import sys
      import pyperclip
  
  
      def copy(data):
          question = input("Copy to clipboard? ")
  
          if question.lower() == 'yes' or question.lower() == 'y':
              pyperclip.copy(data)
              print("Encrypted message copied to clipboard.")
              rerun()
  
          elif question.lower() == 'no' or question.lower() == 'n':
              rerun()
  
          else:
              print("You did not enter a valid input.")
              copy(data)
  
  
      def rerun():
          ask = input("\nWould you like to run this program again? ")
  
          if ask.lower() == "yes" or ask.lower() == "y":
              print(" ")
              run()
  
          elif ask.lower() == 'no' or ask.lower() == 'n':
              sys.exit("\nThank you!")
  
          else:
              print("You did not enter a valid input.")
              rerun()
  
  
      def encrypt(key, msg):
          encrypted_message = []
          for i, c in enumerate(msg):
              key_c = ord(key[i % len(key)])
              msg_c = ord(c)
              encrypted_message.append(chr((msg_c + key_c) % 127))
          return ''.join(encrypted_message)
  
  
      def decrypt(key, encrypted):
          msg = []
          for i, c in enumerate(encrypted):
              key_c = ord(key[i % len(key)])
              enc_c = ord(c)
              msg.append(chr((enc_c - key_c) % 127))
          return ''.join(msg)
  
  
      def run():
          function_type = input("Would you like to encrypt or decrypt a message? ")
  
          if function_type.lower() == "encrypt" or function_type.lower() == "e":
              key = input("\nKey: ")
              msg = input("Message: ")
              data = encrypt(key, msg)
              enc_message = "\nYour encrypted message is: " + data
              print(enc_message)
              copy(data)
  
          elif function_type.lower() == "decrypt" or function_type.lower() == "d":
              key = input("\nKey: ")
  
              question = input("Paste encrypted message from clipboard? ")
  
              if question.lower() == 'yes' or question.lower() == 'y':
                  encrypted = pyperclip.paste()
                  print("Message: " + encrypted)
  
              elif question.lower() == 'no' or question.lower() == 'n':
                  encrypted = input("Message: ")
  
              else:
                  print("You did not enter a valid input.")
                  run()
  
              decrypted = decrypt(key, encrypted)
              decrypted_message = "\nYour decrypted message is: " + decrypted
              print(decrypted_message)
              copy(decrypted)
  
          else:
              print("\nYou did not enter a valid input.\n")
              run()
  
      run()
  </code></pre>
  
  <p>It says <b><i>local variable 'encrypted' might be referenced before assignment</i></b> and highlights</p>
  
  <pre><code>    decrypted = decrypt(key, encrypted)
  </code></pre>
  
  <p>under the run() function.</p>
  
  <p>Is it because I used the variable 'encrypted' in other functions? If so, how would I fix this and still maintain the functionality of my program?</p>
  
  <p>I am relatively new to python so I would appreciate it if you could explain your answers.</p>