【问题标题】:Creating dynamically named variables from user input [duplicate]从用户输入创建动态命名变量[重复]
【发布时间】:2012-07-06 00:06:37
【问题描述】:

我刚刚学习编程,并且正在学习 Python 作为我的第一语言。作为一个练习,我正在尝试编写一个地址簿程序。用户使用命令提示符创建新联系人。新联系人是 Contacts 类的对象实例。

我知道如何在代码中实例化一个类对象,但是如何根据用户输入创建一个具有变量名的对象?假设我提示用户输入名称——如何获取该信息并将其用作新对象的变量名称?

谢谢!!

【问题讨论】:

  • 我们很乐意提供帮助,但您确实应该发布一些代码(您尝试过的),以便我们更好地指导您

标签: python


【解决方案1】:

从 cmets 看来,您所问的问题在这里不止一次被问到。 “如何创建动态命名的变量”。

答案:不要这样做。有可能有更好的方法来解决问题。

说明:

如果您要创建动态命名的变量,那么一旦创建它们,您就无法很好地处理它们。当然有办法检查全局和局部范围,看看有什么。但事实是,您应该对正在创建的内容拥有明确的控制权。

你应该做的是将它们放入字典中:

people = {}
name = raw_input("What name? ") # "person"
people[name] = User(name)

print people
# {'person': <User: "person">}

print people.keys()
# ['person']

这样您就不会在命名空间中创建任意变量。你现在有一个键和对象的字典作为值。允许用户提供的输入来驱动变量的命名也是一种蠕虫。

如需更多信息,请在此处搜索相同主题,并查看大量示例说明为什么不应该这样做。无论您看到什么示例向您展示如何使用 globals() 等,请接受我的建议,不要走那条路。爱和享受......也许拥抱和亲吻,你的字典。

参考资料:

【讨论】:

  • 感谢您的帮助!也许我的问题不够精确。我知道如何根据用户输入为对象的字段赋值,但是对象的实际名称呢?
  • 是的,当您在这里寻求帮助时需要更加详细。当您打印对象时,您是在谈论实例的表示吗?对象的“名称”是什么意思?
  • 呵呵。抱歉,正如我所说,我只是在学习编程,所以请耐心等待。当你创建一个新的类对象时,你给它一个名字。我的类称为 Contacts,所以如果我要创建新对象,它们可能会称为contact1、contact2 等。也许这些称为标识符?无论用户输入什么,我都想命名每个对象的标识符。
  • 在我看来,您要求从用户输入中创建实际的变量名称,这样如果他们输入 "person",它将创建一个变量对象,例如:person = User()。是这个意思吗?
  • 好的,既然我们已经解决了这个问题......不要这样做。这似乎是人们学习编程的一个常见问题。每次被问到“我如何创建动态变量名”的问题时,答案总是“有更好的解决方案来解决您的问题”。我会更新我的答案
【解决方案2】:

您不清楚为什么要实例化名称被确定为运行时所需的对象。重要的是要意识到这不是常见的做法。

不过,可以使用 setattr 内置函数:

setattr(someobject, name, user)

更正常的用法是使用字典。因此,如果您有多个用户实例并想要存储它们,您可以将它们存储在如下的字典中。这将允许您按名称引用对象。

class User(object):

    def __init__(self, name):
        self.name = name


users = {}

name = raw_input("What name?")
users[name] = User(name)


print users
print users['Andre'].name

示例输出:

What name?Andre
{'Andre': <__main__.User object at 0x7f6b418a8710>}
Andre

【讨论】:

  • 不幸的是,这最终不是 OP 想要的。我提供了相同的答案,然后不得不更改它。
  • 巴夫。同样重要的是其他人会从这个问题的绊脚石中学到什么。
  • 非常感谢!有道理!
猜你喜欢
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多