2012-04-21 93 views
1

好吧!基本上,我有一个变量被声明在一个函数中,我想在另一个函数中使用该变量。我不想传递参数,因为我觉得这样做会更简单。这是我的代码:这可能是一个新事物......但是,全局变量

#!/usr/bin/python 

#import os 
import time 
print ("Hello and welcome to Pygame!") 
time.sleep(1) 
print ("Would you like to load? (\"Y/N\")") 

def LON(): 
    loadOrNew = raw_input() 

    if loadOrNew == "N": 
     hp = 100 
     strhp = str(hp) 
     lvl = 1 
     strlvl = str(lvl) 
     atk = 5 
     stratk = str(atk) 
     defn = 2 
     strdefn = str(defn) 
     fout = open("pygame.dat", "w") 
     fout.write (strhp) 
     fout.write("\n") 
     fout.write(strlvl) 
     fout.write("\n") 
     fout.write(stratk) 
     fout.write("\n") 
     fout.write(strdefn) 
     fout.close() 
     FIRSTPLAY() 
     return 

    if loadOrNew == "Y": 
     fin = open("pygame.dat", "r") 
     hpstr = fin.readline() 
     lvlstr = fin.readline() 
     atkstr = fin.readline() 
     defstr = fin.readline() 
     hp = int(float(hpstr)) 
     lvl = int(float(lvlstr)) 
     atk = int(float(atkstr)) 
     defn = int(float(defnstr)) 
     fin.close() 
     return 

    if loadOrNew != "Y" and loadOrNew != "N": 
     print("Im sorry, what?") 
     LON() 
     return 

    return 

def SAVE(): 
    fout = open("pygame.dat", "w") 
    fout.write(hp) 
    fout.write(lvl) 
    fout.write(atk) 
    fout.close(defn) 
    return 


def FIRSTPLAY(): 
    print("man/woman?") 
    gender = raw_input() 
    if gender != "man" and gender != "woman": 
     print("Not valid gender.") 
     FIRSTPLAY() 

    print("KING - ")  
    print(" Young " + gender + ", you are herby my knight!") 
    time.sleep(1) 
    print(" My daughter, princess PYTHON, has been captured!") 
    time.sleep(1) 
    print(" You are to find her, and relieve this world of her captor!") 
    time.sleep(1) 
    print(" Some say this evil man's name is GAMEMAKER, but we really don't know.") 
    time.sleep(1) 
    print(" What do you think it is?") 
    captor = raw_input() 
    time.sleep(1) 
    print(" So you think it is " + captor + "?") 
    time.sleep(1) 
    print("  Very well, find " + captor + " ASAP!") 
    PLAY() 
    return 

def PLAY(): 
    print hp 
    print lvl 
    print atk 
    print defn 
    greenSlime(hp, lvl, atk, defn) 
    return 

def greenSlime(php, plvl, patk, pdefn): 
    MHP = 10 
    MLVL = 1 
    MATK = 2 
    MDEF = 2 
    print "Green Slime - " 
    print " HP: 10" 
    print " LVL: 1" 
    print " ATK: 2" 
    print " DEF: 2" 
    print "ATK OR DEF?" 

LON() 

我想用马力,LVL,ATK和DEFN在LON功能已声明的变量,在播放功能。我确信有一个简单的方法然后传递参数。

回答

1

只是在全局内部声明一个变量将不起作用。全局关键字是要求解释器在给它赋值时不要把某些东西当作本地对象(覆盖同名的全局变量)。你需要做的是在应该分享它的函数上面的范围内定义变量。请注意,您不需要为只读访问声明变量全局函数。当解释器没有在本地范围内找到变量时,它会自动在外部范围内查找它。但是在赋值语句的情况下,它会创建一个新的局部变量。

所以,你想要做的是:

hp = None 
lvl = None 
atk = None 
defn = None 

def LON(): 
    global hp, lvl, atk, defn 
    # rest of LON 

# rest of the functions 

但我要提醒你,全局是不好的编程习惯和传递参数是做正确的方式。

+0

事实上,在上面的代码,都在那里需要的是保持在字典中的数据,并通过这个单一的字典作为参数一起功能。 – jsbueno 2012-04-21 04:51:48

+0

事情是,几乎所有的函数都需要这些变量,并且通过所有这些函数将是一个痛苦。我也需要改变这些变量的功能,所以它很痛苦:/ – 2012-04-21 17:33:52

1

里面LON(),您可以使用global声明:

def LON(): 
    global hp, lvl, atk, defn 

然后,分配到这些变量里面LON()将创建全局变量。一旦全局变量被创建,你可以在别处使用它们(不需要global语句)。请注意,任何你想要为分配一个新的值给全局变量,你需要在该函数中有一个对应的global语句。

0

你需要做的是将函数移动到python类。这样,类内的所有函数都可以访问这些变量,而无需使它们成为全局变量。

你可能结构中的代码是这样的:

#!/usr/bin/python 

#import os 
import time 
print ("Hello and welcome to Pygame!") 
time.sleep(1) 
print ("Would you like to load? (\"Y/N\")") 

class Game: 

    def InitialiseNewPlayer(self): 
    self.hp = 100 
    self.lvl = 1 
    self.atk = 5 
    self.defn = 2 

    def SavePlayer(self): 
    fout = open("pygame.dat", "w") 
    fout.write (str(self.hp)) 
    fout.write("\n") 
    fout.write(str(self.lvl)) 
    fout.write("\n") 
    fout.write(str(self.atk)) 
    fout.write("\n") 
    fout.write(str(self.defn)) 
    fout.close() 

    def LoadPlayer(self): 
    fin = open("pygame.dat", "r") 
    self.hp = int(float(fin.readline())) 
    self.lvl = int(float(fin.readline())) 
    self.atk = int(float(fin.readline())) 
    self.defn = int(float(fin.readline())) 
    fin.close() 

    def LON(self): 
    while true: 
     loadOrNew = raw_input() 

     if loadOrNew == "N": 
     self.InitialiseNewPlayer() 
     self.SavePlayer(); 
     self.FIRSTPLAY() 
     return 

     if loadOrNew == "Y": 
     self.LoadPlayer() 
     return 

     print("Im sorry, what?") 

    # Watch out as this is using a different format to the SavePlayer above! 
    def SAVE(self): 
    fout = open("pygame.dat", "w") 
    fout.write(self.hp) 
    fout.write(self.lvl) 
    fout.write(self.atk) 
    fout.close(self.defn) 


    def FIRSTPLAY(self): 
    print("man/woman?") 
    gender = raw_input() 
    if gender != "man" and gender != "woman": 
     print("Not valid gender.") 
     FIRSTPLAY() 

    print("KING - ")  
    print(" Young " + gender + ", you are herby my knight!") 
    time.sleep(1) 
    print(" My daughter, princess PYTHON, has been captured!") 
    time.sleep(1) 
    print(" You are to find her, and relieve this world of her captor!") 
    time.sleep(1) 
    print(" Some say this evil man's name is GAMEMAKER, but we really don't know.") 
    time.sleep(1) 
    print(" What do you think it is?") 
    captor = raw_input() 
    time.sleep(1) 
    print(" So you think it is " + captor + "?") 
    time.sleep(1) 
    print("  Very well, find " + captor + " ASAP!") 
    self.PLAY() 
    return 

    def PLAY(self): 
     print self.hp 
     print self.lvl 
     print self.atk 
     print self.defn 
     self.greenSlime() 

    def greenSlime(self): 
    MHP = 10 
    MLVL = 1 
    MATK = 2 
    MDEF = 2 
    print "Green Slime - " 
    print " HP: 10" 
    print " LVL: 1" 
    print " ATK: 2" 
    print " DEF: 2" 
    print "ATK OR DEF?" 

game = Game() 
game.LON() 
相关问题