Python 我腌了我的元组

Python 我腌了我的元组,python,tuples,pickle,Python,Tuples,Pickle,我对python还是新手。我正在为一个更大的项目设计框架。这个程序让你想到一个圆或正方形,然后问四个问题,然后决定答案 我正处于框架的最后一步,但遇到了一个问题。我得到“全局名称'qas1'未定义” getQuestion question='qas'全局名称'qas'中的第50行未定义 当我试图腌制我的元组时发生了这种情况 下面是我的加载程序,用于创建包含元组的pickle文件: import cPickle import os qas1 = [ ('Are you more like Wa

我对python还是新手。我正在为一个更大的项目设计框架。这个程序让你想到一个圆或正方形,然后问四个问题,然后决定答案

我正处于框架的最后一步,但遇到了一个问题。我得到“全局名称'qas1'未定义”

getQuestion question='qas'全局名称'qas'中的第50行未定义

当我试图腌制我的元组时发生了这种情况

下面是我的加载程序,用于创建包含元组的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()
导入cPickle
#计数器
反圆=0
对角尺=0
#元组
def hasFile():
打印“我看到文件了”
qas_文件=打开('qas.dat','r')
qas1=cPickle.load(qas_文件)
qas2=cPickle.load(qas_文件)
qas3=cPickle.load(qas_文件)
qas4=cPickle.load(qas_文件)
qas_文件.close
#我要分配的变量
messagedisplated=0
问题=‘啤酒’
#打印到屏幕
def showQaA():
打印问题[0]
打印问题[1][0]
打印问题[2][0]
#接收并执行响应
def getresponse():
全局反循环
全局对角尺
全局qas1、qas2、qas3、qas4
ansew=原始_输入('>>'))
如果ansew==“1”:
副方=副方+问题[1][1]#(+1)
反循环=反循环+问题[1][2]#(+0)
elif ansew==“2”:
副方=副方+问题[2][1]#(+0)
反循环=反循环+问题[2][2]#(+1)
打印计数器圆
打印对角尺
#获取要显示的当前元组信息(将更高级)
def getQuestion():
全球问题
如果messageDisplayed==0:
问题=qas1
elif messagedisplated==1:
问题=qas2
elif messagedisplated==2:
问题=qas3
elif messagedisplated==3:
问题=qas4
其他:
打印“你疯了”
#计算并打印结果
def results():
打印“这是循环结果”,反循环
打印“这是方形结果”,对方形
如果对角规<对角规:
打印“你是一个圆!”
elif反方形>反圆形:
打印“你是一个正方形!”
其他:
打印“你是难以捉摸的哑炮!”
#mainLoop当前设置为4个问题
hasFile()

在第二个文件中显示消息时,qas[1-4]都是
hasFile
函数的本地文件。使其全球化,您的代码将起作用:

def hasFile():
   global qas1, qas2, qas3, qas4
   # etc
同样的错误也出现在第一个代码中,但更难注意到——这四个变量仍然只在函数中赋值——这会隐藏同名的全局变量,使它们保持不变。但是,由于加载它们不会更改其内容,因此它似乎可以工作。

在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
#元组
def hasFile():

全局qas1、qas2、qas3、qas4 35;当您仅使用新值分配像qas这样的变量时,就像您在
hasFile()
中所做的那样,您正在创建一个局部变量。。。不是全球性的。在分配给全局qas之前,请确保指定它

经典问题标题:)旁注:在
hasFile
中,您已经编写了
qas_文件。关闭
。这会导致引用
qas_文件
close
方法,但不会调用它。您需要参数(
qas_file.close()
)或文件句柄,直到python关闭。谢谢!我仍然不知道如何在函数中传递变量,Ima noob。现在我正试图摆脱我的全局变量。所有的论坛似乎都建议像plauge一样避免使用它们。我可以把“问题”转到本地,但我的计数器有问题。我唯一的理想方法是尝试将它们保存到txt文件或对它们进行pickle,然后在循环重新启动时重新加载。这是一种不好的做法吗?@user3479560您可以将变量存储在程序外、pickle或文本文件中,但这并不是很有用,除非您希望保存一些内容以供将来执行程序。我认为在主循环中管理它们将是最好的。可以让getResponse()为正方形或圆形返回不同的值。我建议您熟悉函数、参数、返回内容等,这样您就可以看到有多少程序是结构化的,并且让函数在没有全局变量的情况下协同工作。有很多东西需要学习,但您的代码将更有组织性和可重用性。祝你好运@用户3479560如果你想找教程的话,我喜欢这本书。