Returning a list from a function in Python
<p>I'm creating a game for my sister, and I want a function to return a list variable, so I can pass it to another variable.</p>

<p>The relevant code is as follows:</p>

<pre><code>def startNewGame():
    while 1:
    #Introduction:
        print
        print """Hello,
    You will now be guided through the setup process.
There are 7 steps to this.
You can cancel setup at any time by typing 'cancelSetup'
        Thankyou"""
    #Step 1 (Name):
        print
        print """Step 1 of 7:
    Type in a name for your PotatoHead:
    """
        inputPHName = raw_input('|Enter Name:|')
        if inputPHName == 'cancelSetup':
            sys.exit()
    #Step 2 (Gender):
        print
        print """Step 2 of 7:
    Choose the gender of your PotatoHead:
                        input either 'm' or 'f'
    """
        inputPHGender = raw_input('|Enter Gender:|')
        if inputPHGender == 'cancelSetup':
            sys.exit()
    #Step 3 (Colour):
        print
        print """Step 3 of 7:
    Choose the colour your PotatoHead will be:
                        Only Red, Blue, Green and Yellow are currently supported
    """
        inputPHColour = raw_input('|Enter Colour:|')
        if inputPHColour == 'cancelSetup':
            sys.exit()
    #Step 4 (Favourite Thing):
        print
        print """Step 4 of 7:
    Type your PotatoHead's favourite thing:
    """
        inputPHFavThing = raw_input('|Enter Favourite Thing:|')
        if inputPHFavThing == 'cancelSetup':
            sys.exit()
    # Step 5 (First Toy):
        print
        print """Step 5 of 7:
    Choose a first toy for your PotatoHead:
    """
        inputPHFirstToy = raw_input('|Enter First Toy:|')
        if inputPHFirstToy == 'cancelSetup':
            sys.exit()
    #Step 6 (Check stats):
        while 1:
            print
            print """Step 6 of 7:
    Check the following details to make sure that they are correct:
    """
            print
            print """Name:\t\t\t""" + inputPHName + """
Gender:\t\t\t""" + inputPHGender + """
Colour:\t\t\t""" + inputPHColour + """
Favourite Thing:\t""" + inputPHFavThing + """
First Toy:\t\t""" + inputPHFirstToy + """
"""
            print
            print "Enter 'y' or 'n'"
            inputMCheckStats = raw_input('|Is this information correct?|')
            if inputMCheckStats == 'cancelSetup':
                sys.exit()
            elif inputMCheckStats == 'y':
                break
            elif inputMCheckStats == 'n':
                print "Re-enter info: ..."
                print
                break
            else:
                "The value you entered was incorrect, please re-enter your choice"
        if inputMCheckStats == 'y':
            break
    #Step 7 (Define variables for the creation of the PotatoHead):
    MFCreatePH = []
    print
    print """Step 7 of 7:
    Your PotatoHead will now be created...

    Creating variables...
    """
    MFCreatePH = [inputPHName, inputPHGender, inputPHColour, inputPHFavThing, inputPHFirstToy]
    time.sleep(1)
    print "inputPHName"
    print
    time.sleep(1)
    print "inputPHFirstToy"
    print
    return MFCreatePH
    print "Your PotatoHead varibles have been successfully created!"
</code></pre>

<p>Then it is passed to another function that was imported from another module</p>

<pre><code>from potatohead import *
</code></pre>

<p>...</p>

<pre><code>welcomeMessage()
MCreatePH = startGame()
myPotatoHead = PotatoHead(MCreatePH)
</code></pre>

<p>the code for the PotatoHead object is in the potatohead.py module which was imported above, and is as follows:</p>

<pre><code>class PotatoHead:
#Initialise the PotatoHead object:
def __init__(self, data):
    self.data = data    #Takes the data from the start new game function - see main.py
    #Defines the PotatoHead starting attributes:
    self.name = data[0]
    self.gender = data[1]
    self.colour = data[2]
    self.favouriteThing = data[3]
    self.firstToy = data[4]
    self.age = '0.0'
    self.education = [self.eduScience, self.eduEnglish, self.eduMaths] = '0.0', '0.0', '0.0'
    self.fitness = '0.0'
    self.happiness = '10.0'
    self.health = '10.0'
    self.hunger = '0.0'
    self.tiredness = 'Not in this version'
    self.toys = []
    self.toys.append(self.firstToy)
    self.time = '0'
    #Sets data lists for saving, loading and general use:
    self.phData = (self.name, self.gender, self.colour, self.favouriteThing, self.firstToy)
    self.phAdvData = (self.name, self.gender, self.colour, self.favouriteThing, self.firstToy,
                      self.age, self.education, self.fitness, self.happiness, self.health, self.hunger,
                      self.tiredness, self.toys)
</code></pre>

<p>However, when I run the program this error appears:</p>

<pre><code>Traceback (most recent call last):
 File "/Users/Jasper/Documents/Programming/Potato Head Game/Current/main.py", line 158, in &lt;module&gt;
myPotatoHead = PotatoHead(MCreatePH)
 File "/Users/Jasper/Documents/Programming/Potato Head Game/Current/potatohead.py", line 15, in __init__
self.name = data[0]
TypeError: 'NoneType' object is unsubscriptable
</code></pre>

<p>What am i doing wrong?</p>

<p>-----EDIT-----</p>

<p>The program finishes as so:</p>

<blockquote>
  <p>Step 7 of 7:</p>

<pre><code>Your PotatoHead will now be created...

Creating variables...
</code></pre>
  
  <p>inputPHName</p>
  
  <p>inputPHFirstToy</p>
</blockquote>

<p>Then it goes to the Tracback</p>

<p>-----EDIT2-----</p>

<p>This is the EXACT code I'm running in its entirety:</p>

<pre><code>#+--------------------------------------+#
#| main.py                              |#
#| A main module for the Potato Head    |#
#|  Game to pull the other modules      |#
#|  together and control through user   |#
#|  input                               |#
#| Author:                |#
#| Date Created / Modified:             |#
#|              3/2/10 | 20/2/10         |#
#+--------------------------------------+#  Tested: No

#Import the required modules:
import time
import random
import sys
from potatohead import *
from toy import *

#Start the Game:
def welcomeMessage():
    print "----- START NEW GAME -----------------------"
    print "==Print Welcome Message=="
    print "loading... \t loading... \t loading..."
    time.sleep(1)
    print "loading..."
    time.sleep(1)
    print "LOADED..."
    print; print; print;
    print """Hello,
    Welcome to the Potato Head Game. In this game you can create
a Potato Head, and look after it, like a Virtual Pet.
    This game is constantly being updated and expanded. Please
look out for updates.
"""

#Choose whether to start a new game or load a previously saved game:
def startGame():
    while 1:
        print "--------------------"
        print """ Choose an option:
New_Game
or
Load_Game
"""
        startGameInput = raw_input('&gt;&gt;&gt; &gt;')
        if startGameInput == 'New_Game':
            startNewGame()
            break
        elif startGameInput == 'Load_Game':
            print "This function is not yet supported"
            print "Try Again"
            print
        else:
            print "You must have mistyped the command: Type either 'New_Game' or 'Load_Game'"
            print

#Set the new game up:
def startNewGame():
    while 1:
    #Introduction:
        print
        print """Hello,
    You will now be guided through the setup process.
There are 7 steps to this.
You can cancel setup at any time by typing 'cancelSetup'
        Thankyou"""
    #Step 1 (Name):
        print
        print """Step 1 of 7:
    Type in a name for your PotatoHead:
    """
        inputPHName = raw_input('|Enter Name:|')
        if inputPHName == 'cancelSetup':
            sys.exit()
    #Step 2 (Gender):
        print
        print """Step 2 of 7:
    Choose the gender of your PotatoHead:
                        input either 'm' or 'f'
    """
        inputPHGender = raw_input('|Enter Gender:|')
        if inputPHGender == 'cancelSetup':
            sys.exit()
    #Step 3 (Colour):
        print
        print """Step 3 of 7:
    Choose the colour your PotatoHead will be:
                        Only Red, Blue, Green and Yellow are currently supported
    """
        inputPHColour = raw_input('|Enter Colour:|')
        if inputPHColour == 'cancelSetup':
            sys.exit()
    #Step 4 (Favourite Thing):
        print
        print """Step 4 of 7:
    Type your PotatoHead's favourite thing:
    """
        inputPHFavThing = raw_input('|Enter Favourite Thing:|')
        if inputPHFavThing == 'cancelSetup':
            sys.exit()
    # Step 5 (First Toy):
        print
        print """Step 5 of 7:
    Choose a first toy for your PotatoHead:
    """
        inputPHFirstToy = raw_input('|Enter First Toy:|')
        if inputPHFirstToy == 'cancelSetup':
            sys.exit()
    #Step 6 (Check stats):
        while 1:
            print
            print """Step 6 of 7:
    Check the following details to make sure that they are correct:
    """
            print
            print """Name:\t\t\t""" + inputPHName + """
Gender:\t\t\t""" + inputPHGender + """
Colour:\t\t\t""" + inputPHColour + """
Favourite Thing:\t""" + inputPHFavThing + """
First Toy:\t\t""" + inputPHFirstToy + """
"""
            print
            print "Enter 'y' or 'n'"
            inputMCheckStats = raw_input('|Is this information correct?|')
            if inputMCheckStats == 'cancelSetup':
                sys.exit()
            elif inputMCheckStats == 'y':
                break
            elif inputMCheckStats == 'n':
                print "Re-enter info: ..."
                print
                break
            else:
                "The value you entered was incorrect, please re-enter your choice"
        if inputMCheckStats == 'y':
            break
    #Step 7 (Define variables for the creation of the PotatoHead):
    MFCreatePH = []
    print
    print """Step 7 of 7:
    Your PotatoHead will now be created...

    Creating variables...
    """
    MFCreatePH = [inputPHName, inputPHGender, inputPHColour, inputPHFavThing, inputPHFirstToy]
    time.sleep(1)
    print "inputPHName"
    print
    time.sleep(1)
    print "inputPHFirstToy"
    print
    return MFCreatePH
    print "Your PotatoHead varibles have been successfully created!"

#Run Program:
welcomeMessage()
MCreatePH = startGame()
myPotatoHead = PotatoHead(MCreatePH)
</code></pre>

<p>The potatohead.py module is as follows:</p>

<pre><code>#+--------------------------------------+#
#| potatohead.py                        |#
#| A module for the Potato Head Game    |#
#| Author:                              |#
#| Date Created / Modified:             |#
#|              24/1/10 | 24/1/10       |#
#+--------------------------------------+#  Tested: Yes (24/1/10)

#Create the PotatoHead class:
class PotatoHead:
    #Initialise the PotatoHead object:
    def __init__(self, data):
        self.data = data    #Takes the data from the start new game function - see main.py
        #Defines the PotatoHead starting attributes:
        self.name = data[0]
        self.gender = data[1]
        self.colour = data[2]
        self.favouriteThing = data[3]
        self.firstToy = data[4]
        self.age = '0.0'
        self.education = [self.eduScience, self.eduEnglish, self.eduMaths] = '0.0', '0.0', '0.0'
        self.fitness = '0.0'
        self.happiness = '10.0'
        self.health = '10.0'
        self.hunger = '0.0'
        self.tiredness = 'Not in this version'
        self.toys = []
        self.toys.append(self.firstToy)
        self.time = '0'
        #Sets data lists for saving, loading and general use:
        self.phData = (self.name, self.gender, self.colour, self.favouriteThing, self.firstToy)
        self.phAdvData = (self.name, self.gender, self.colour, self.favouriteThing, self.firstToy,
                          self.age, self.education, self.fitness, self.happiness, self.health, self.hunger,
                          self.tiredness, self.toys)

    #Define the phStats variable, enabling easy display of PotatoHead attributes:
    def phDefStats(self):
        self.phStats = """Your Potato Head's Stats are as follows:
----------------------------------------
Name: \t\t""" + self.name + """
Gender: \t\t""" + self.gender + """
Colour: \t\t""" + self.colour + """
Favourite Thing: \t""" + self.favouriteThing + """
First Toy: \t""" + self.firstToy + """
Age: \t\t""" + self.age + """
Education: \t""" + str(float(self.eduScience) + float(self.eduEnglish) + float(self.eduMaths)) + """
-&gt; Science: \t""" + self.eduScience + """
-&gt; English: \t""" + self.eduEnglish + """
-&gt; Maths:   \t""" + self.eduMaths + """
Fitness: \t""" + self.fitness + """
Happiness: \t""" + self.happiness + """
Health: \t""" + self.health + """
Hunger: \t""" + self.hunger + """
Tiredness: \t""" + self.tiredness + """
Toys: \t\t""" + str(self.toys) + """
Time: \t\t""" + self.time + """
"""

    #Change the PotatoHead's favourite thing:
    def phChangeFavouriteThing(self, newFavouriteThing):
        self.favouriteThing = newFavouriteThing
        phChangeFavouriteThingMsg = "Your Potato Head's favourite thing is " + self.favouriteThing + "."

    #"Feed" the Potato Head i.e. Reduce the 'self.hunger' attribute's value:
    def phFeed(self):
        if float(self.hunger) &gt;=3.0:
            self.hunger = str(float(self.hunger) - 3.0)
        elif float(self.hunger) &lt; 3.0:
            self.hunger = '0.0'
        self.time = str(int(self.time) + 1) #Pass time

    #"Exercise" the Potato Head if between the ages of 5 and 25:
    def phExercise(self):
        if float(self.age) &lt; 5.1 or float(self.age) &gt; 25.1:
            print "This Potato Head is either too young or too old for this activity!"
        else:
            if float(self.fitness) &lt;= 8.0:
                self.fitness = str(float(self.fitness) + 2.0)
            elif float(self.fitness) &gt; 8.0:
                self.fitness = '10.0'
        self.time = str(int(self.time) + 1) #Pass time

    #"Teach" the Potato Head:
    def phTeach(self, subject):
        if subject == 'Science':
            if float(self.eduScience) &lt;= 9.0:
                self.eduScience = str(float(self.eduScience) + 1.0)
            elif float(self.eduScience) &gt; 9.0 and float(self.eduScience) &lt; 10.0:
                self.eduScience = '10.0'
            elif float(self.eduScience) == 10.0:
                print "Your Potato Head has gained the highest level of qualifications in this subject! It cannot learn any more!"
        elif subject == 'English':
            if float(self.eduEnglish) &lt;= 9.0:
                self.eduEnglish = str(float(self.eduEnglish) + 1.0)
            elif float(self.eduEnglish) &gt; 9.0 and float(self.eduEnglish) &lt; 10.0:
                self.eduEnglish = '10.0'
            elif float(self.eduEnglish) == 10.0:
                print "Your Potato Head has gained the highest level of qualifications in this subject! It cannot learn any more!"
        elif subject == 'Maths':
            if float(self.eduMaths) &lt;= 9.0:
                self.eduMaths = str(float(self.eduMaths) + 1.0)
            elif float(self.eduMaths) &gt; 9.0 and float(self.eduMaths) &lt; 10.0:
                self.eduMaths = '10.0'
            elif float(self.eduMaths) == 10.0:
                print "Your Potato Head has gained the highest level of qualifications in this subject! It cannot learn any more!"
        else:
            print "That subject is not an option..."
            print "Please choose either Science, English or Maths"
        self.time = str(int(self.time) + 1) #Pass time

    #Increase Health:
    def phGoToDoctor(self):
        self.health = '10.0'
        self.time = str(int(self.time) + 1) #Pass time

    #Sleep: Age, change stats:              #(Time Passes)
    def phSleep(self):
        self.time = '0'                   #Resets time for next 'day' (can do more things next day)
        #Increase hunger:
        if float(self.hunger) &lt;= 5.0:
            self.hunger = str(float(self.hunger) + 5.0)
        elif float(self.hunger) &gt; 5.0:
            self.hunger = '10.0'
        #Lower Fitness:
        if float(self.fitness) &gt;= 0.5:
            self.fitness = str(float(self.fitness) - 0.5)
        elif float(self.fitness) &lt; 0.5:
            self.fitness = '0.0'
        #Lower Health:
        if float(self.health) &gt;= 0.5:
            self.health = str(float(self.health) - 0.5)
        elif float(self.health) &lt; 0.5:
            self.health = '0.0'
        #Lower Happiness:
        if float(self.happiness) &gt;= 2.0:
            self.happiness = str(float(self.happiness) - 2.0)
        elif float(self.happiness) &lt; 2.0:
            self.happiness = '0.0'
        #Increase the Potato Head's age:
        self.age = str(float(self.age) + 0.1)
</code></pre>

<p>The game is still under development - There may be parts of modules that aren't complete, but I don't think they're causing the problem</p>
