前言:我花了很多时间尝试阅读类似这样的帖子,并尝试了很多不同的东西,但对于我的生活,我无法理解我做错了什么,或者为什么这样做'工作。有人可以给我一个关于我做错了什么的ELI5答案,或者为什么这不能按照我期望的方式工作?
class User:
def __init__(self, first, last, age):
self.firstname = first
self.lastname = last
self.age = age
dict = {
'User1': {'id': 'id001', 'firstname': 'User', 'lastname': 'One', 'age': 11},
'User2': {'id': 'id002', 'firstname': 'User', 'lastname': 'Two', 'age': 22},
'User3': {'id': 'id003', 'firstname': 'User', 'lastname': 'Three', 'age': 33}
}
for user in dict:
u = dict[user]
user = User(u['firstname'], u['lastname'], u['age'])
try:
print(User1.lastname)
except Exception as e:
print(e)
finally:
print(user.lastname)
返回:
name 'User1' is not defined
Three
显然user
使用来自dict
的数据进行了三次实例化,其中User3
的数据是最后一项。
如果我这样做:
for user in dict:
print(user)
打印出来:
User1
User2
User3
所以我的期望是for循环会运行,然后我就可以调用User1.firstname
,User2.lastname
或User3.age
,它会给我dict
(分别为User,Two,33)中的相同数据,但情况显然不是这样。
帮助?
答案 0 :(得分:3)
您并非存储您创建的实例。
for user in dict:
u = dict[user]
user = User(u['firstname'], u['lastname'], u['age'])
^^创建一堆User
' s,但为每个user
分配相同的名称users = []
for user in dict:
u = dict[user]
user = User(u['firstname'], u['lastname'], u['age'])
users.append(user)
。这意味着用户1和2会在您继续循环循环时丢失。
如果您想要访问这些用户,则需要存储对创建的实例的引用:
for user in users:
print(user)
然后,打印结果:
for user in dict
* PS :当您编写dict
时,您正在迭代User1, User2, User3
的键,这就是您获得dict
的原因}。
** PPS :您绝对不应该使用dict()
作为名称,它会影响内置-s
功能,并会在以后引起您的问题。
答案 1 :(得分:1)
为了完整性 - 感谢globals()[key] = value
可以在python中创建全局变量 - 但是每个有经验的人都不会建议你这样做 - 如果不是因为非常具体和经过深思熟虑的原因没有理由这样做。尽管如此,你可以在这里看到它是如何实现的: