0

我是新人,请多多包涵。下面是我的代码:

class Player():
    name = "UnknownName"
    stren = 10
    dex = 10
    con = 10
    intel = 10
    wis = 10
    cha = 10

    def randAssign(self):
        global stren, dex, con, intel, wis, cha
        stat_List = [stren, dex, con, intel, wis, cha]

        for stat in stat_List:
             r_1 = random.randint(1,6)
             r_2 = random.randint(1,6)
             r_3 = random.randint(1,6)
             r_4 = random.randint(1,6)

             stat_Val = r_1 + r_2 + r_3 + r_4 - min(r_1, r_2, r_3, r_4)
             stat = stat_Val

randAssign 是 Player() 中的一种方法,我试图随机设置玩家的统计数据,并且需要在激活 randAssign() 时重写类变量。由于某种原因,使用 global 会传递以下错误:

NameError: name 'stren' is not defined. 

使用 Nonlocal 会产生此错误:

SyntaxError: no binding for nonlocal 'stren' found

如果没有全局或非局部,它就不会重写Player()'s变量。我已经做了十几次迭代,从完全错误到“我认为这会起作用,但它不起作用”,需要帮助。

4

3 回答 3

3

像这样在类中定义变量将使类的所有实例共享这些变量,这可能会导致奇怪的情况(尤其是对于可变对象)。(请参阅Python 文档)您最可能想要做的是使用这个:

class Player:

    def __init__(self):
        self.stren = 10
        self.xcx = 10
        etc.

    def randAssign(self):
        self.stren = randint(1,10)
        ...
于 2018-04-12T15:52:35.483 回答
2

不确定您是否熟悉类与实例方法,但试试这个:

class Player():
    name = "UnknownName"
    stren = 10
    dex = 10
    con = 10
    intel = 10
    wis = 10
    cha = 10

    @classmethod
    def randAssign(cls):
        stat_List = [cls.stren, 
                     cls.dex, 
                     cls.con, 
                     cls.intel, 
                     cls.wis, 
                     cls.cha]

        for stat in stat_List:
             r_1 = random.randint(1,6)
             r_2 = random.randint(1,6)
             r_3 = random.randint(1,6)
             r_4 = random.randint(1,6)

             stat_Val = r_1 + r_2 + r_3 + r_4 - min(r_1, r_2, r_3, r_4)
             stat = stat_Val

鉴于您正在做的事情(创建随机播放器统计信息),如果在实例化调用下为每个播放器实例完成,这将更合适。__init__

阅读此SO以获取有关这两种方法之间差异的更多信息。

编辑:为了说明评论中的观点......

这是您的方法将遇到的问题(我上面的示例仅解决您的范围问题,而不是您的实现问题)

class Temp:
    stat = 1
    @classmethod
    def test(cls):
        stats = [cls.stat] # container contains copies of primitive types 
        print (stats) # [1]
        for i in range(1):
            stats[i] = (stats[i] + 2) * 3 # 1 + 2 * 3 = 9
        print (stats) # [9]
        print (cls.stat) # 1

要执行您想要的评论,请执行以下操作:

class Temp:
    stats = {'stat': 1}
    @classmethod
    def test(cls):
        stats = [cls.stats] # container contains reference to another container
        print (stats) # {'stat': 1}
        for stat in stats:
            cls.stats[stat] = (cls.stats[stat] + 2) * 3 # 1 + 2 * 3 = 9
        print (stats) # {'stat': 9}
        print (cls.stats) # {'stat': 9}, look they updated!
于 2018-04-12T15:56:16.463 回答
1

由于您已经在函数定义中传递了self参数,因此您应该在适当的命名空间中引用这些变量:

self.stren = ...

代替

globals stren
stren = ...
于 2018-04-12T15:54:52.210 回答