0

I have had problems with the shell saying local variable referenced before assignment and don't feel any previous answers have helped. Can I have some specific advice to this code:

import random

marginalCheck = random.randint(0,1)

print("This is the political campaign simulator")

global popularity

popularity = 50

def unpopularT():
    if popularity <= 30 and popularity < 0:
        print("You are decreasing in popularity.")
        popularityRecover = input("Do you wish to carry on or resign. If this carries on, you are likely to lose to a landslide by your Labour opposition")

        if popularityRecover == "resign":
            print("You have become an infamous, unpopular politician. You are remembered as a horrible, unkind person")
        else:
            print("You are hanging by a thread")
    elif popularity > 70:
        print("You are seriously doing well among your supporters and gaining new ones every day")
    else:
        print("You are doing fine so far in the campaign")

def campaignT():
            leadershipT = input("You are chosen as a candidate by your colleagues in the Tory leadership contest. Do you wish to take an A - Far Right, B - Right, C - Centre, D - Left or E - Far Left stance on the political spectrum")

            if leadershipT == "A" or leadershipT == "B":
                print("You have been elected as leader of the Tories and leader of the opposition. Now the election campaign starts")

                ClassicToryAusterity = input("What do you wish to do about the poor funding in the NHS by the Labour government. A - Do you wish to keep the current program, B - Do you wish to increase funding dramatically and increase taxes, C - Do you propose minor increases with small raises on tax, D - Do you support austere implementations on the Health Service")
                if ClassicToryAusterity == "A":
                        popularity += -5
                elif ClassicToryAusterity == "B":
                        popularity += 5
                elif ClassicToryAusterity == "C":
                        popularity += 2
                elif ClassicToryAusterity == "D":
                        popularity += -10
                BedroomTax = input("What do you propose to do about the bedroom tax. A - increase it, B - freeze it, C - Decrease it, D - Scrap it")
                if BedroomTax == "A":
                    popularity += -10
                elif BedroomTax == "B":
                    popularity += -5
                elif BedroomTax == "C":
                    popularity += -1
                else:
                    popularity += 10
                unpopularT()
            else:
                print("The Tory whip dislikes your stance and you have not been voted as leader")

chosenParty = input("Choose a party. A - LibDem, B - Labour, C- Tory")

if chosenParty == "C":
     print("You have been elected as a councillor by your fellow peers.")
     marginality = input("They want you to stand as a MP in a seat. Do you want to stand in a safe or marginal seat")
if marginality == "marginal":
    if marginalCheck == 0:
        print("You have failed to be elected to parliament")
    else:
        print("You are duly elected the MP for your constituency!")
        campaignT()
else:
    campaignT()

What I don't understand is that I have referenced popularity as a global variable, but according to the shell, it is local.

Md. Rezwanul Haque
  • 2,882
  • 7
  • 28
  • 45
Anish
  • 1
  • 1
  • 2
  • 3
    The global declaration needs to be inside your function – DavidG Jul 20 '17 at 14:11
  • This is somewhat messy code, can you please provide a [mcve]? – S.G. Harmonia Jul 20 '17 at 14:13
  • 1
    It might be worth looking at [Why are global variables evil?](https://stackoverflow.com/questions/19158339/why-are-global-variables-evil) – DavidG Jul 20 '17 at 14:14
  • A declaration outside of a function definition shouldn't change the semantics of the function itself, which is why you can't stand outside of a function and declare that some of its local variables are now supposed to be treated as global. – John Coleman Jul 20 '17 at 14:15

1 Answers1

5

If you want to use access global variables inside functions you don't need to declare anything, but if you need to re-assign the variable by any means, you need to declare it inside the function. For example:

test = 'hello'
def print_test():
    print test

def set_test():
    global test
    test = 'new value'

in your case, you didn't declare the global variable popularity inside your function and you were trying to re-assign it. So in your case:

def unpopularT():
    global popularity
    # your code

def campaignT():
    global popularity
    # your code
Mohd
  • 5,523
  • 7
  • 19
  • 30