为什么不能在python中动态生成变量名?

2024-10-01 13:26:25 发布

您现在位置:Python中文网/ 问答频道 /正文

现在,我正在学习Python,并与OOP的一些概念作斗争,其中之一是(对我来说)动态初始化类实例并将它们分配给动态生成的变量名有多困难,以及为什么我在阅读时认为我不应该这样做。你知道吗

在大多数具有类似方向的线程中,答案似乎是这样做是不符合Pythonic的。你知道吗

例如generating variable names on fly in python

有人能详细说明一下吗?你知道吗

以典型的面向对象学习案例为例:

LOE = ["graham", "eric", "terry_G", "terry_J", "john", "carol"]
class Employee():
    def __init__(self, name, job="comedian"):
        self.name = name
        self.job = job

为什么这样做更好:

employees = []
for name in LOE:
    emp = Employee(name)
    employees.append(emp)

然后呢

for emp in employees:
    if emp.name == "eric":
        print(emp.job)

而不是这个

for name in LOE:
    globals()[name] = Employee(name)

以及

print(eric.job)

谢谢!你知道吗


Tags: nameinself概念foremployeejob动态
2条回答

如果动态生成变量名,则不知道存在什么名称,也不能在代码中使用它们。你知道吗

globals()[some_unknown_name] = Foo()

好吧,现在怎么办?你不能安全地这样做:

eric.bar()

因为你不知道eric是否存在。不管怎样,您都必须使用字典/列表来测试eric是否存在:

if 'eric' in globals(): ...

因此,只需将对象存储在字典或列表中即可:

people = {}
people['eric'] = Foo()

通过这种方式,您还可以安全地迭代一个数据结构以访问所有分组对象,而无需将它们与其他全局变量排序。你知道吗

globals()给你一个dict你可以把名字放进去。但是你同样可以自己做dict,把名字放在那里。你知道吗

因此,可以归结为“名称空间”的概念,即将相似的事物隔离到不同的数据结构中的概念。你知道吗

您应该这样做:

employees = {}
employees['alice'] = ...
employees['bob'] = ...
employees['chuck'] = ...

现在,如果您的程序中有另一部分描述了演练的各个部分,您可以这样做:

drill['chuck'] = ...

你就不会和那个叫查克的人有名字冲突了。如果一切都是全球性的,你就会有问题。查克甚至可能失业。你知道吗

相关问题 更多 >