Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为对象创建随机、唯一的变量名_Python_Variables_Random_Unique_Names - Fatal编程技术网

Python 为对象创建随机、唯一的变量名

Python 为对象创建随机、唯一的变量名,python,variables,random,unique,names,Python,Variables,Random,Unique,Names,我第一次玩Python和任何编程语言,所以请耐心听我说。两周前,我开始了一门在线课程,但我试着在一旁开发一个小游戏,以便更快地学习(并获得乐趣)。这是一个文本冒险,但它将有随机遭遇和与敌人战斗,这些敌人有随机装备,玩家可以掠夺 这是我的问题:如果我为我的随机遭遇创建随机对象/武器,我需要确保该对象具有唯一的名称。从理论上讲,关卡的设计方式可能是无限多的对象(可以是开放式的,只是会突然出现遭遇) 这是我目前的做法 class Item_NPCs: #create objects for NPCs

我第一次玩Python和任何编程语言,所以请耐心听我说。两周前,我开始了一门在线课程,但我试着在一旁开发一个小游戏,以便更快地学习(并获得乐趣)。这是一个文本冒险,但它将有随机遭遇和与敌人战斗,这些敌人有随机装备,玩家可以掠夺

这是我的问题:如果我为我的随机遭遇创建随机对象/武器,我需要确保该对象具有唯一的名称。从理论上讲,关卡的设计方式可能是无限多的对象(可以是开放式的,只是会突然出现遭遇)

这是我目前的做法

class Item_NPCs: #create objects for NPCs

    def__init__(self, item_type, item_number):
    # e.g. item_type 1 = weapons, item_type2 = potions, etc.

        if item_type == 1 and item number == 1:
             self.property1 = 5
             self.property2 = 4

        if item_type == 1 and item_number ==2:

       # etc. :)

def prepare_encounter(): 

    inventory_NPC = [] # empty list for stuff the NPC carries around

    XXX = Class_Item(item_type, item_number) # I might randomize the arguments.   
重要的是,我希望“XXX”是唯一的和随机的,这样就不会有对象存在超过一次,以后可以放入玩家的库存中

怎么做


为什么你需要它是随机的?您可以简单地使用列表,并将每个新对象附加到列表中,其索引是其唯一标识符:

items = []
items.append( Class_Item(item_type, item_number) )
但如果你真的需要随机标识符,也许你可以使用字典:

items = dict()
items[random_id] = Class_Item(item_type, item_number)

这要求random_id是可散列的(但如果它是数字或字符串,则应该是可散列的)。

为什么需要它是随机的?您可以简单地使用列表,并将每个新对象附加到列表中,其索引是其唯一标识符:

items = []
items.append( Class_Item(item_type, item_number) )
但如果你真的需要随机标识符,也许你可以使用字典:

items = dict()
items[random_id] = Class_Item(item_type, item_number)

这要求随机id是可散列的(但如果它是数字或字符串,则应该是可散列的)。

我不知道为什么其他人没有想到这一点:

yourvariableName = randint(0,1000)
exec("var_%s = 'value'" % yourVariableName)
我只是自己想的。我希望它能帮助你

缺点是你不能只做这件事:

print(var_yourVariableName)
您只能执行以下操作:

exec("print(var_%s)" % yourVariableName)
但你可能会以这样或那样的方式绕过这一点。如果你想弄明白的话,请留下评论


还有一个缺点-如果以某种方式使用,它可能非常不安全(因为我们使用的是
exec
),所以请确保覆盖所有漏洞

我不知道为什么其他人没有想到这一点:

yourvariableName = randint(0,1000)
exec("var_%s = 'value'" % yourVariableName)
我只是自己想的。我希望它能帮助你

缺点是你不能只做这件事:

print(var_yourVariableName)
您只能执行以下操作:

exec("print(var_%s)" % yourVariableName)
但你可能会以这样或那样的方式绕过这一点。如果你想弄明白的话,请留下评论


还有一个缺点-如果以某种方式使用,它可能非常不安全(因为我们使用的是
exec
),所以请确保覆盖所有漏洞

重要提示:您的值必须是唯一的,而不是您的变量。变量是算法中的占位符。如果算法的占位符是未定义的混乱,则该算法无法运行。如果你需要保存多个值,甚至是随机值,请使用<代码>列表>代码>或代码> DICT。@ DeeSez是正确的,如果你需要一个随机的名字来命名对象,你应该考虑将它传递给构造函数 CaseSub项,并将其赋值为<代码> CaseType项实例。或者如果名称总是在“项目X”的形式上。您可以在构造函数中生成该名称,方法是让类记录已创建实例的数量。重要提示:您的值必须是唯一的,而不是变量。变量是算法中的占位符。如果算法的占位符是未定义的混乱,则该算法无法运行。如果你需要保存多个值,甚至是随机值,请使用<代码>列表>代码>或代码> DICT。@ DeeSez是正确的,如果你需要一个随机的名字来命名对象,你应该考虑将它传递给构造函数 CaseSub项,并将其赋值为<代码> CaseType项实例。或者如果名称总是在“项目X”的形式上。您可以通过让类记录创建的实例的数量在构造函数中生成该名称。好的,这很有趣,因为它暗示我出错了。我认为在同一个变量名下创建两个相同的对象,然后尝试将其视为两个不同的对象将是一个问题。如果我理解正确的话,在不同索引的同一个列表中就足够让python把这个东西当作两个不同的对象了?如果是,我不需要随机的名字。我认为这是必要的抱歉,现在无法测试任何内容。你可以用不同的名称创建对象,但我认为这不是你真正想要的。你真正想要的是物体的集合:玩家的物体,敌人的物体等等。。。这为您的程序提供了结构(并避免了混乱的变量,如deceze所说),但它也为您提供了更强大的操作对象的功能。例如,使用
玩家物品列表/dict,你可以通过一个简单的循环向玩家显示他的物品:
对于玩家物品中的物品:打印(物品)
,并且在战斗结束时,你可以添加战利品:
玩家物品。扩展(敌人物品)
。我喜欢扩展的东西。我可能会让玩家选择掠夺什么。。。。顺便说一句:这是我到目前为止得到的库存和对象模块:。。。我这样问是因为现在我想添加enctounter系统,并且认为我需要不同的变量名。但是这里的帖子暗示情况并非如此。期待实验。选择战利品也可以用类似的方法。您可以打印敌人物品及其id号:
对于id,枚举中的物品(敌人物品):打印(id,物品)
,从玩家那里获得他想要的物品的id列表,使用
选择的物品=原始输入()
,然后将它们添加到玩家物品中:
玩家物品。扩展([敌人物品[id]对于选择的物品中的id])
。我想在这里强调的是,使用诸如
list
dict
set
等数据结构。。。是处理大型对象集合的正确方法,允许您以更简单、更清晰的方式进行操作。从我在代码中看到的情况来看,您的方法非常面向对象。我认为使用数据结构可以更有效地完成一些事情。如果是