首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python变量不会在for循环中反弹

Python变量不会在for循环中反弹
EN

Stack Overflow用户
提问于 2012-03-08 16:34:42
回答 2查看 156关注 0票数 1
代码语言:javascript
复制
employees = []
for i in range(0,10):

    emp = Employee(i)
    emp.first_name = "%s-%s"%("first name", i)
    emp.last_name = "%s-%s"%("last_name", i)
    emp.desgination = "%s-%s"%("engineer", i)

    employees.append(emp)


ids = [e.eid for e in employees]

下面是我的类定义:

代码语言:javascript
复制
class Employee:

    _fields = {}

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

    def __getattr__(self, name):
        return self._fields.get(name)

    def __setattr__(self,name,value):
        self._fields[name] = value

    def __str__(self):
        return str(self._fields)

    def __unicode__(self):
        return str(self._fields)

问题是,当我打印is时,它包含10乘以9...即

代码语言:javascript
复制
[9, 9, 9, 9, 9, 9, 9, 9, 9, 9]

似乎相同的emp变量正在被覆盖。我不确定出了什么问题。虽然我是一名Java程序员,但我认为我对Python也有一个很好的了解。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-08 17:03:07

实际上,问题出在您的java过去!:)

错误在这里:

代码语言:javascript
复制
_fields = {}

_fields是类成员!因此,Employee的每个实例共享相同的_fields变量,当您修改一个实例时,就会修改所有其他对象。您必须将_fields = {}部件移动到__init__函数中:

代码语言:javascript
复制
self._fields={}

但是,您将遇到另一个问题:self.eid = xx调用__setattr__方法!( self._fields也是如此!)

解决方案是,当您需要访问实例的“_fields”成员而不是self._fields时,可以使用self.__dict__['_fields']。它将直接访问成员,而不是通过__getattr__和无限递归,最终会有一个很好的堆栈溢出。

票数 4
EN

Stack Overflow用户

发布于 2012-03-08 16:58:48

这是函数的副作用:

代码语言:javascript
复制
def __getattr__(self, name):
    return self._fields.get(name)

def __setattr__(self,name,value):
    self._fields[name] = value

去掉它们,它就可以工作了。所以这就是我们要看的方向。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9614795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档