Skip to main content
 首页 » 编程设计

python之将程序从 FreeBASIC 转换为 Python : globalizing variables

2025年05月04日11虾米姐

在之前的帖子中,有人告诉我我正在用 Python 编写代码,就像您在 BASIC 中一样(我还没有“考虑”使用 Python)。这可能是真的,这就是我需要帮助的原因。话虽这么说,到目前为止我已经阅读了一本关于 Python 的书(Python 字节序),我又在网上买了两本书(其中一本是 Invent with Python,我正在阅读)并且我做了很多来自新波士顿的教程。不过,我的问题对您来说可能听起来很新手。

在 FreeBasic 中,变量都是全局化的。在 Python 中,我必须为我创建的每个新函数将它们全局化。这不是很实用。那么我应该做什么? “Python 母语者”将如何解决这个问题?下面是我创建的一个小程序,我在其中对函数内的所有变量进行了全局化。

#-*- coding: iso8859_1 -*- 
 
import random 
 
ca1 = 10 
ca2 = 10 
taco = 20 
pv1 = random.randint(1,10) 
pv2 = random.randint(1,10) 
cnt = 0 
pv1Dep = pv1 
pv2Dep = pv2 
ast = "*" * 7 
d20_1 = random.randint(1,20) 
d8_1 = random.randint(1,8) 
d20_2 = random.randint(1,20) 
d8_2 = random.randint(1,8) 
 
def intro(): 
    global ca1 
    global ca2 
    global taco 
    global pv1 
    global pv2 
    global cnt 
    global pv1Dep 
    global pv2Dep 
    global d20_1 
    global d8_1 
    global d20_2 
    global d8_2 
 
 
    print "Imaginez deux guerriers de D&D 2e édition qui se battent." 
    print 
    print "Guerrier 1: " + str(pv1) + " PV, épée longue (1-8 points de dégât), TACO de 20, CA de " + str(ca1) + "." 
    print "Guerrier 2: " + str(pv2) + " PV, épée longue (1-8 points de dégât), TACO de 20, CA de " + str(ca2) + "." 
    print 
 
def nouveauCombat(): 
    global ca1 
    global ca2 
    global taco 
    global pv1 
    global pv2 
    global cnt 
    global pv1Dep 
    global pv2Dep 
    global d20_1 
    global d8_1 
    global d20_2 
    global d8_2 
 
    print ast + "NOUVEAU COMBAT" + ast 
    print 
    while ((pv1 > 0) and (pv2 > 0)): 
        cnt = cnt + 1 
        print ast + "ROUND " + str(cnt) + ": INITIATIVE" + ast 
        print 
        calcInitiative() 
        print 
    print ast + "RESULTAT" + ast 
    print 
    resultat() 
 
def calcInitiative(): 
    global ca1 
    global ca2 
    global taco 
    global pv1 
    global pv2 
    global cnt 
    global pv1Dep 
    global pv2Dep 
    global d20_1 
    global d8_1 
    global d20_2 
    global d8_2 
 
    initiative1 = random.randint(1,10) 
    initiative2 = random.randint(1,10) 
    print "Le guerrier 1 fait son jet d'initiative." 
    print str(initiative1) + "!" 
    print 
    print "Le guerrier 2 fait son jet d'initiative." 
    print str(initiative2) + "!" 
    print 
    if initiative1 == initiative2: 
        print "Les deux guerriers attaquent au même moment." 
        print 
        print ast + "ROUND " + str(cnt) + ": ATTAQUE" + ast 
        print 
        attaque1() 
        print 
        attaque2() 
    elif initiative1 < initiative2: 
        print "Le guerrier 1 attaque en premier." 
        print 
        print ast + "ROUND " + str(cnt) + ": ATTAQUE" + ast 
        print 
        attaque1() 
        print 
        if pv2 > 0: 
            print 
            attaque2() 
    else: 
        print "Le guerrier 2 attaque en premier." 
        print 
        print ast + "ROUND " + str(cnt) + ": ATTAQUE" + ast 
        print 
        attaque2() 
        print 
        if pv1 > 0: 
            print 
            attaque2() 
 
def attaque1(): 
    global ca1 
    global ca2 
    global taco 
    global pv1 
    global pv2 
    global cnt 
    global pv1Dep 
    global pv2Dep 
    global d20_1 
    global d8_1 
    global d20_2 
    global d8_2 
 
    print "Le guerrier 1 fait son jet de toucher." 
    print str(d20_1) + "!" 
    if d20_1 >= ca2: 
        print "Touché!" 
        pv2 = pv2 - d8_1 
        print str(d8_1) + " points de dégât!" 
        print "Le guerrier 2 est à " + str(pv2) + "/" + str(pv2Dep) + " PV!" 
    else: 
        print "Raté!" 
 
def attaque2(): 
    global ca1 
    global ca2 
    global taco 
    global pv1 
    global pv2 
    global cnt 
    global pv1Dep 
    global pv2Dep 
    global d20_1 
    global d8_1 
    global d20_2 
    global d8_2 
 
    print "Le guerrier 2 fait son jet de toucher." 
    print str(d20_2) + "!" 
    if d20_2 >= ca1: 
        print "Touché!" 
        pv1 = pv1 - d8_2 
        print str(d8_2) + " points de dégât!" 
        print "Le guerrier 1 est à " + str(pv1) + "/" + str(pv1Dep) + " PV!" 
    else: 
        print "Raté!" 
 
def resultat(): 
    global ca1 
    global ca2 
    global taco 
    global pv1 
    global pv2 
    global cnt 
    global pv1Dep 
    global pv2Dep 
    global d20_1 
    global d8_1 
    global d20_2 
    global d8_2 
 
    print "Le combat prend fin au round " + str(cnt) + "." 
    print 
 
    if pv1 == pv1Dep: 
        print "Le guerrier 1 n'a pas la moindre égratignure." 
    elif pv1 > 0: 
        print "Le guerrier 1 est blessé." 
    else: 
        print "Le guerrier 1 est mort." 
 
    print "Il finit le combat avec " + str(pv1) + "/" +str (pv1Dep) + " PV." 
    print 
 
    if pv2 == pv2Dep: 
        print "Le guerrier 2 n'a pas la moindre égratignure." 
    elif pv2 > 0: 
        print "Le guerrier 2 est blessé." 
    else: 
        print "Le guerrier 2 est mort." 
 
    print "Il finit le combat avec " + str(pv2) + "/" +str (pv2Dep) + " PV." 
    print 
 
intro() 
nouveauCombat() 

请您参考如下方法:

除非您要分配给它,否则您不需要将名称声明为全局名称。

a = 1 
b = 2 
def foo(): 
    global b 
    print a # prints 1 
    b = 3 
foo() 
print b # prints 3