【问题标题】:How do I make a variable made out of a string global in python?如何在 python 中创建一个由全局字符串组成的变量?
【发布时间】:2013-07-08 11:10:07
【问题描述】:

我正在尝试制作二十一点游戏。 我已经制作了抽牌和检查手牌总和是否超过 21 的功能,但仅适用于 3 名玩家。这很容易,我有 3 个列表。

但我想为 N 名玩家做这件事,所以我想保留我的功能并制作另一个在玩家和他们的手之间切换的功能。

def create_hands():
global total_players
for x in range(1, total_players+1):
    vars()["hand_%d" % x] = []
    print hand_1

我想为尽可能多的 N 个玩家 (total_players) 创建与 hand_1、hand_2 等中一样多的手牌

由于上面的代码,我得到一个全局名称'hand_1'未定义错误

所以这一切都归结为:

  1. 如何使 "hand_%d" % x 全局化?

  2. 有更好的方法吗?

【问题讨论】:

    标签: python blackjack


    【解决方案1】:

    是的,有更好的方法。只需创建一个列表列表。如果可能的话,应该省略使用 vars。它真的很难阅读和调试,你最近会后悔这种态度。当你创建一个像players -> hand -> cards 这样的列表,或者甚至像players['player1'][3] 这样的玩家的第三张牌时,你会更满意。

    【讨论】:

    • 嗯,你在python中,而python,一种语言的下面代表一种思维方式。您可以毫无问题地定义players = {'player1': [1, 2, 3], 'players2': [1, 2, 3, 4]}。只需谷歌搜索“python 结构”并阅读一些相关信息。一切都是一个对象,所以要从它开始。
    • 您也可以尝试实际使用对象。我最近看到有人试图在不使用单个类的情况下实现二十一点游戏——它通常最终成为你无法理解的程序地狱。我认为您应该认真考虑实施诸如卡片、手牌和套牌之类的类。然后,您可以在存储手牌(或玩家及其手牌)时使用列表(或字典)。
    【解决方案2】:

    你遇到的问题是vars()是locals()的别名,官方文档中有如下注释:

    Note: The contents of this dictionary should not be modified; 
    changes may not affect the values of local and free variables 
    used by the interpreter.
    

    换句话说,向 vars() 添加键 NOT 一定会更新本地变量表(这就是您收到 global name hand_1 is not defined 错误的原因 - vars()[ "hand_1" ] 不会hand_1 到一个局部变量中)。

    正如 Gandi 所提到的,有更简单的方法来做你想做的事情 - 使用列表列表或类似的东西。除了创建任意命名的局部变量之外,还有更传统的方法可以解决这个问题。

    【讨论】:

      【解决方案3】:

      是的,可以做到的。替换

      vars()["hand_%d" % x] = []
      

      globals()["hand_%d" % x] = []
      

      但请注意,此解决方案有点老套,很容易导致问题(维护困难、无法跟踪自发创建的变量等)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-01
        • 2020-09-24
        • 1970-01-01
        • 1970-01-01
        • 2021-12-11
        相关资源
        最近更新 更多