我腌制了我的tup

2024-10-03 19:25:04 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我正在执行框架的最后一步,但遇到了一个问题。我得到“未定义全局名‘qas1’”

Line 50 in getQuestion question = 'qas' Global name 'qas' is not defined

当我试图腌制元组的时候就发生了这种事。在

下面是我的加载程序,用于创建包含元组的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()

代码工作正常,但当我试图使用它创建的文件时遇到了问题。在

^{pr2}$

我知道,这需要看很多代码。当程序第一次加载名称qas1时,它会重新确认它是一个元组,但是当我试图将属性传递给getQuestion()中的'question'时:它忘记了它们是什么。有什么理想问题吗?在


Tags: 程序youdefloaddumplikefile元组
3条回答

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

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

在第一个代码中也出现了同样的错误,但更难注意到——这四个变量仍然只在函数中赋值——这使得同名的全局变量变得模糊,保持不变。但是,由于加载它们不会改变它们的内容,所以它似乎可以工作。在

当您只需为qas这样的变量分配一个新值时,就像您在hasFile()中所做的那样,您正在创建一个局部变量。。。不是全球性的。在简单地分配之前,请确保指定global qas。在

在hasFile()中,您设置了qas1、qas2、qas3和qas4的值,但没有首先将它们声明为global,这意味着它们没有在全局范围内设置。在

# 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

在每个设置全局变量的函数中,都需要显式地将它们声明为全局变量。见the answers to this question。在

另外,在将来,考虑将值传递给函数,而不是使用全局变量,这很容易出错,特别是对于初学者。在

相关问题 更多 >