【问题标题】:Python - How would you make the variables in this block global?Python - 你如何使这个块中的变量成为全局变量?
【发布时间】:2011-12-30 01:04:39
【问题描述】:

[Python] 我需要将前 3 个变量(攻击、生命值、金钱)设为全局变量,但我不知道如何设置,因为它们是随机的(random.randint)。有人可以告诉我代码应该是什么吗?谢谢!

编辑:我的错误类似于脚本后面的“分配前引用的局部变量‘钱’”。

这是完整脚本的链接: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

【问题讨论】:

  • 你能澄清一下吗?从random.randint 分配值与全局变量有什么关系?另外,这是在脚本的主体中还是在函数内部? (在第一种情况下,它们已经是全球性的了......)

标签: python random global-variables global


【解决方案1】:

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

否则,您可以通过使用global 语句在函数内定义变量写入到全局范围内的变量:

global attack, hitpoints, money

顺便说一句,没有global 也可以阅读,修改可变对象也是如此。

【讨论】:

    【解决方案2】:

    我认为您误解了变量是全局变量的含义。我强烈建议阅读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 添加到该范围的顶部将导致在您的模块的全局命名空间中设置这些变量。

    【讨论】:

    • 哦,我想我开始明白了。稍后在程序中,我使用变量“money”,但它位于 def 块中。如果我删除 def 块并每次都输入它会起作用吗?
    • 谢谢!在我所有的 def 块中,我添加了全局攻击、生命值、金钱。它现在完美运行。非常感谢,这已经困扰我好几天了!
    【解决方案3】:

    在某个具有全局范围的地方用一些初始值初始化它们。

    【讨论】:

    • 不会有所作为。在 Python 中,while 不会引入新的作用域。
    • 已修复? (更多字符,所以让我发布这个)
    • 仍在等待麦迪逊的澄清,因为如果这就是所有代码,变量已经是全局的:D
    • 不,它还没有修复。你想要整个程序的代码吗?
    • 有点长,我应该把它放在评论里吗?
    【解决方案4】:

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

    Python 内置了字符串扩展,例如:print('Your attack level is %s.' % attack)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 2015-06-25
      相关资源
      最近更新 更多