我是新人,请耐心等待我。以下是我的代码:
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
变量。
我已经完成了十几次这样的迭代,从完全错误到“我认为这会起作用但它没有”,需要帮助。
答案 0 :(得分:3)
如此定义类中的变量将使您的类的所有实例共享这些变量,这可能导致时髦的情况(特别是对于可变对象)。 (请参阅Python documentation)您最有可能想要做的是:
class Player:
def __init__(self):
self.stren = 10
self.xcx = 10
etc.
def randAssign(self):
self.stren = randint(1,10)
...
答案 1 :(得分: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!
答案 2 :(得分:1)
由于您已在函数定义中传递了self
参数,因此应在相应的命名空间中引用这些变量:
self.stren = ...
而不是
globals stren
stren = ...