Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.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_Dictionary_Self - Fatal编程技术网

Python字典没有像我希望的那样返回新值

Python字典没有像我希望的那样返回新值,python,dictionary,self,Python,Dictionary,Self,很明显我做错了什么。我是一个新的python/noob编码器,所以这对你们中的许多人来说可能是显而易见的,但我不知道该怎么做 class hero(): """Lets do some heros shit""" def __init__(self, name="Jimmy", prof="Warrior", weapon="Sword"): """Constructor for hero""" self.name = name

很明显我做错了什么。我是一个新的python/noob编码器,所以这对你们中的许多人来说可能是显而易见的,但我不知道该怎么做

class hero():
    """Lets do some heros shit"""

    def __init__(self, name="Jimmy", prof="Warrior", weapon="Sword"):
        """Constructor for hero"""
        self.name = name
        self.prof = prof
        self.weapon = weapon
        self.herodict = {
            "Name": self.name,
            "Class": self.prof,
            "Weapon": self.weapon
        }
        self.herotext = {
            "Welcome": "Greetings, hero. What is thine name? ",
            "AskClass": "A fine name %s. What is your class? " % self.herodict['Name'],
        }

    def thingy(self, textkey, herokey):
        n = raw_input(self.herotext[textkey])
        self.herodict[herokey] = n

        if self.herodict[herokey] != "":
            print self.herodict[herokey]
        else:
            self.herodict[herokey] = self.name
            print self.herodict[herokey]

    def setHeroName(self):
        self.thingy("Welcome", 'Name')

    def setHeroClass(self):
        self.thingy("AskClass", 'Class')
所以基本上你运行它,它设置了一系列默认值。它将询问一个名称,您为其提供用户输入,它将名称键设置为您输入的新值。他们假设使用新的键:value或name:(userinput)并在下一个小句子中使用它。但它会返回并使用默认值“jimmy”

我需要做什么?

线路:

 "AskClass": "A fine name %s. What is your class? " % self.herodict['Name'],
在创建类时执行,而不是在以后打印时执行。创建类时,
self.herodict['Name']
设置为
'Jimmy'

稍后,当你有一个名字时,你必须做插值。也许您需要改用可调用项,比如
lambda
对象:

self.herotext = {
    "Welcome": lambda self: "Greetings, hero. What is thine name? ",
    "AskClass": lambda self: "A fine name %s. What is your class? " % self.herodict['Name'],
}
然后,稍后调用他们传入
self

n = raw_input(self.herotext[textkey](self))

我明白你的意思,我创建了这个类,而不是在打印时。但后来我看了看,有一个问题:就在
n=raw_input(self.herotext[textkey])self.herodict[herokey]=n
行之后,我有一行写着
print self.herodict[herokey]
,它会打印正确的新用户输入名(不是“吉米”)。这是因为它在同一个def中吗?似乎他们正在访问两个不同的目录;一个是最近的,一个是从对象首次初始化时开始的。
herotext
字典是在
\uuuu init\uuuu
中创建的,因此在创建实例时也是如此。然而,
n
局部变量是在
thingy
方法运行时设置的。在同样的方法中,你将self.herodict[herokey]设置为
n
,这样当你打印self.herodict[herokey]时,它仍然有
n
的值,这是用户在你要求
原始输入()时刚刚输入的值。我想我现在理解得更好了。试着在我的脑海里想象它<代码>类初始化->默认名称集->setHeroName()->thingy(newname)->本地名称已设置->本地名称已打印->setheroaclass()如果在开始时已初始化,则会看到原始dict默认值,因为它是在更改之前创建的
?我想我应该开始使用文件来存储这些东西,然后再读回。或者进入lambda,因为我以前从未使用过。谢谢你的耐心和投入,我很感激!