我试图在不使用 for 循环的情况下从员工对象字典中打印员工对象信息。这是我到目前为止所做的:
employee_dict = {}
class Employee:
def __init__(self, id, salary):
self.id = id
self.salary = salary
self.employee_dictionary(self)
def info(self):
return "Employee ID:{} \nSalary:{}".format(self.id, self.salary)
def employee_dictionary(self):
employee_dict = {self.id: self}
emp = Employee(1, 10)
emp1 = Employee(2, 5)
employee = employee_dict[1]
print(employee.info())
有人能指出我正确的方向吗?我觉得我很亲近。这段代码给我的错误是:
Traceback (most recent call last):
File "/home/rob/PycharmProjects/untitled4/sdfghsfdgjrtyrty.py", line 19, in <module>
employee = employee_dict[1]
KeyError: 1
最佳答案
这里的根本问题是您没有正确使用字典。而不是将新员工添加到现有的全局 employee_dict
,您正在尝试用一个仅包含新员工的新字典替换该全局字典:
def employee_dictionary(self):
employee_dict = {self.id: self}
如果你解决了这个问题,你实际询问的问题甚至都不会出现:
def employee_dictionary(self):
employee_dict[self.id] = self
这将从 self.id
添加一个新映射至 self
在字典中。所以,在你的两个 Employee
之后构造,ID 为 1 和 2,您将在字典中得到两个条目,键为 1
和 2
,一切都会正常进行。
此外,您绝对应该至少考虑另外两个更改:
- 用类属性替换全局变量,也可能替换
employee_dictionary
方法与类方法,详见 scharette's answer . - 将方法重命名为
employee_dictionary
(a) 标记为私有(private)的(以_
开头的方法按照惯例是私有(private)的,这意味着您的用户知道他们不应该调用它,除非他们有一个奇怪的用例),以及 (b) 更能反射(reflect)它的内容做。也许_register
或_add_to_dict
?
其中的第一个也(再次在 scharette 的回答中详细说明)使您所问的问题消失了。 (但无论如何你仍然需要主要修复。)
但您可能无论如何都想了解更直接的范围问题 — 以及当您不能让它消失时如何解决它。
在 Python 中,您在函数中分配的任何名称都是局部变量。如果有 spam = …
函数中的任何地方(或 with eggs as spam:
或其他也算作赋值的东西),每个对 spam
的引用在那个函数中是那个地方。所以,employee_dict = {self.id: self}
创建一个名为 employee_dict
的局部变量,给它赋值,然后返回,此时所有的本地人都消失了。它恰好与全局同名这一事实对 Python 来说没有任何意义(尽管对于像您这样的人类读者来说,这显然令人困惑)。
您在任何地方没有分配给它的任何名称都是局部或封闭或全局或内置变量。当你做 employee_dict[self.id]
,因为没有 employee_dict = …
在任何地方,Python 都会搜索本地、封闭、全局和内置范围以找到您所说的 employee_dict
的含义。 , 它找到了全局。
您可以强制 Python 将名称视为全局变量,即使您分配给它也是如此,使用 global
函数顶部的语句:
def employee_dictionary(self):
global employee_dict
employee_dict = {self.id: self}
添加global
即使名称已经是全局名称也是安全的。这通常是没有意义的——但是如果你不确定某事是否算作一个赋值(或者只是不确定你的代码的 future 读者会确定......),并且你想明确变量是一个全局变量,你可以声明它:
def employee_dictionary(self):
global employee_dict
employee_dict[self.id] = self
关于python - 从员工字典中打印员工对象信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51312587/