Я мариновал свой кортеж

Я все еще новичок в python. Я работаю над рамкой для более крупного проекта. Эта программа заставляет вас думать о круге или квадрате, затем он задает четыре вопроса, а затем решает ответить.

Я нахожусь на последнем шаге рамки, но столкнулся с проблемой. Я получаю "глобальное имя" qas1 'не определено "

Строка 50 в вопросе getQuestion = 'qas' Глобальное имя 'qas' не определено

Это случилось, когда я попытался рассортировать свои кортежи.

Вот моя программа загрузки для создания файла pickle, который содержит мои кортежи:

import cPickle
import os

qas1 = [
('Are you more like Waffle or a Pancake'), 
('1. Waffle', 1, 0),
('2. Pancake', 0, 1)
]

qas2 = [
('Do you have a straight edge?'),
('1. Yes', 1, 0),
('2. No', 0, 1)
]

qas3 = [
('Are you simliar in shape to a lolipop?'),
('1. Yes', 0, 1),
('2. No', 1, 0)
]
qas4 = [
('Is the world rounded like a planet, or flat like a map?'),
('1. Rounded', 0, 1),
("2. Flat", 1, 0)
]

def hasFile():
    print 'I see the file'
    qas_file = open('qas.dat', 'r')
    qas1 = cPickle.load(qas_file)
    qas2 = cPickle.load(qas_file)
    qas3 = cPickle.load(qas_file)
    qas4 = cPickle.load(qas_file)
    qas_file.close
    confirmer()

def noFile():
    print 'I dont see a file...'
    saver()

def confirmer():
    print qas1
    print qas2
    print qas3
    print qas4

def saver():
    qas_file = open('qas.dat', 'w')
    print 'No worries, creating one now'
    cPickle.dump(qas1, qas_file)
    cPickle.dump(qas2, qas_file)
    cPickle.dump(qas3, qas_file)
    cPickle.dump(qas4, qas_file)
    qas_file.close
    print 'all done'

fname = "qas.dat"
if os.path.isfile(fname):
    hasFile()
else:
    noFile()

Код работал нормально, но когда я попытался использовать созданный файл, я столкнулся с проблемами.

import cPickle

#Counters
counterCircle = 0
counterSquare = 0

# tuples
def hasFile():
    print 'I see the file'
    qas_file = open('qas.dat', 'r')
    qas1 = cPickle.load(qas_file)
    qas2 = cPickle.load(qas_file)
    qas3 = cPickle.load(qas_file)
    qas4 = cPickle.load(qas_file)
    qas_file.close



#varibles Im made to assign
messageDisplayed = 0
question = 'beer'

#prints to screen   
def showQaA():
    print question[0]
    print question[1][0]
    print question[2][0]

#recieves and implements responses
def getResponce():
    global counterCircle
    global counterSquare
    global qas1, qas2, qas3, qas4
    ansew = raw_input('>> ')
    if ansew == "1":
        counterSquare = counterSquare + question[1][1]#(+1)
        counterCircle = counterCircle + question[1][2]#(+0)
    elif ansew == "2":
        counterSquare = counterSquare + question[2][1]#(+0)
        counterCircle = counterCircle + question[2][2]#(+1)
    print counterCircle
    print counterSquare


#Gets the current tuple infomation to display (Will be more advanced)
def getQuestion():
    global question
    if messageDisplayed == 0:
        question = qas1
    elif messageDisplayed == 1:
        question = qas2
    elif messageDisplayed == 2:
        question = qas3
    elif messageDisplayed == 3:
        question = qas4
    else:
        print 'youre screwd'

#figures out and prints results
def results():
    print "This is the circle results", counterCircle
    print "This is the square results", counterSquare
    if counterSquare < counterCircle:
        print "You are a circle!"
    elif counterSquare > counterCircle:
        print "You are a square!"
    else:
        print "You are the elusive squircle!"

#mainLoop currently set to 4 questions
hasFile()
while messageDisplayed <=3:
    getQuestion()
    showQaA()
    getResponce()
    messageDisplayed +=1
results()

Это код много кода, который я должен знать. Когда программа сначала загружает имя qas1, он повторяет, что это кортеж, но когда я пытаюсь передать свойства "вопрос" в getQuestion(): он забывает, каковы они были. Любые идеалы, в чем проблема?

Ответ 1

В вашем втором файле qas [1-4] являются локальными для функции hasFile. Сделайте их глобальными, и ваш код будет работать:

def hasFile():
   global qas1, qas2, qas3, qas4
   # etc

Такая же ошибка возникает в первом коде, но это сложнее заметить - четыре переменные по-прежнему назначаются только в функции - это затеняет идентичные глобальные переменные, оставляя их неизменными. Однако, поскольку загрузка их, как ожидается, не изменит их содержимое, она, похоже, работает.

Ответ 2

В hasFile() вы устанавливаете значения qas1, qas2, qas3 и qas4, но сначала вы не объявляете их глобальными, что означает, что они не установлены в глобальной области.

# tuples
def hasFile():
    global qas1, qas2, qas3, qas4 # <-- global declaration
    print 'I see the file'
    qas_file = open('qas.dat', 'r')
    qas1 = cPickle.load(qas_file)
    qas2 = cPickle.load(qas_file)
    qas3 = cPickle.load(qas_file)
    qas4 = cPickle.load(qas_file)
    qas_file.close

В каждой функции вы задаете глобальные переменные, вам нужно явно объявить их глобальными. См. ответы на этот вопрос.

Кроме того, в будущем рассмотрите передачу значений в функции вместо использования глобальных переменных, которые могут быть подвержены ошибкам, особенно для новичков.

Ответ 3

Когда вы просто назначаете переменную типа qas с новым значением, как вы это делаете в hasFile(), вы создаете локальный var... не глобальный. Обязательно укажите global qas, прежде чем просто назначьте его.