2011-12-30 44 views
1

[Python]我需要将前3个变量(攻击,生命值,金钱)全局化,但我不知道它们是随机的(random.randint)。有人能告诉我代码应该是什么吗?谢谢!Python - 你将如何使这个块的变量全局?

编辑:我的错误就像脚本后面的“赋值之前引用的局部变量”钱“。

继承人链接到完整的脚本:http://dl.dropbox.com/u/55052881/fightprogram.txt

很抱歉,如果它真的很草率,我刚开始学习Python的一个星期前。

while roll == 1: 

    attack = random.randint(1, 100) 
    hitpoints = random.randint(1, 500) 
    money = random.randint(1, 1000) 

    attackstr = str(attack)    
    hitpointsstr = str(hitpoints) 
    moneystr = str(money) 

    print() 
    print('Your attack level is ' + attackstr + '.') 
    print('You have ' + hitpointsstr + ' hitpoints.') 
    print('Your have ' + moneystr + ' coins.') 

    print() 
    print('Type 1 to reroll.') 
    print('Type 2 to proceed.') 
    reroll = input() 
    reroll = int(reroll) 
    if reroll == 2: 
     break 
+0

能否请你澄清?从random.randint分配的值与全局变量有什么关系?另外,这是在脚本的主体还是在函数内? (在第一种情况下,它们是全球性的,已经......) – 2011-12-30 01:08:38

回答

1

我想你误解了一个变量是全局变量意味着什么。我强烈建议阅读有关scopes and namespaces的Python文档,但我会尽我所能以与您的问题相关的方式进行总结。

“全局变量”是一个全局名称空间中的变量。每个模块都有一个单独的全局名称空间。除了模块,类和函数是唯一可以创建新范围的东西。您创建的任何新变量都将放置在最里面的范围内。

有一个global keyword,它可以被用来引用全局变量,但这只是当你分配到一个全局变量必要的,例如:

x = 5 
def foo(): 
    x = 10 
def bar(): 
    global x 
    x = 20 

>>> x  # global variable x 
5 
>>> foo() # foo creates a new x in the local scope 
>>> x  # global x is unchanged 
5 
>>> bar() # bar uses global keyword to reference the global x 
>>> x  # global x is now 20 
20 

在你孤立的代码示例,attackhitpointsmoney已经是全局变量,因为它们不在其他范围内,并且它们将在循环的每次运行中进行修改。如果您的代码实际上是在类或函数中,那么将global attack, hitpoints, money行添加到该范围的顶部将导致这些变量在模块的全局名称空间中设置。

+0

之前引用的局部变量'钱',我想我会开始得到它。后来在程序中我使用了变量'money',但它在def块中。它会工作,如果我删除def块,只需键入它每次? – 2011-12-30 06:19:27

+0

谢谢!在我的所有防御块中,我加入了全局攻击,生命值,金钱。它现在完美。非常感谢,这已经让我烦恼了好几天! – 2011-12-30 08:35:57

1

使用一些初始值在全局范围内初始化它们。

+1

不会有所作为。在Python中,'while'不会引入新的范围。 – 2011-12-30 01:13:27

+0

已修复?(更多的字符,所以SO会让我发布) – BenH 2011-12-30 01:14:24

+0

还在等待麦迪逊的澄清,因为如果这是所有的代码,变量已全球化:D – 2011-12-30 01:17:18

2

我假设你发布的代码是在一个函数内?如果是的话,你应该返回值而不是使用全局变量:return attack, hitpoints, money返回一个元组与这三个值。

否则,您可以使用global语句定义它的函数里面写以在全球范围内的变量:顺便说

global attack, hitpoints, money 

阅读作品,未经global等不修改可变对象。

0

顺便说一句,你不需要attackstr = str(attack)

Python已经建成串扩张,就像这样:print('Your attack level is %s.' % attack)