首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在方法中创建的python方法变量和对象

在方法中创建的python方法变量和对象
EN

Stack Overflow用户
提问于 2011-08-16 16:34:12
回答 1查看 495关注 0票数 1

所以我知道在Python中,在方法中声明的变量在其外部是不可见的。但是它们的生命周期是什么呢?我希望每次调用一个方法时,都会创建一个在该方法中声明的变量。

我问你是因为下面的情况。我有一个如下的方法(这与cherrypy一起使用,可能不相关,但我仍然会添加它,以防它以任何方式影响它)。

首先是我使用的自定义过滤器类:

代码语言:javascript
运行
复制
class Filter():
"""
Class used to filter tables displayed in UI, based on few criteria.
Initialize filter with a list of fields, and correspondinf values.
"""
def __init__(self, display_name= "", fields= [], values= [], operations= []):
    self.display_name = display_name
    self.fields = fields
    self.values = values
    self.selected = False 
    self.operations = operations

现在我所说的方法

代码语言:javascript
运行
复制
@cherrypy.expose
@logged() 
def getfiltereddatatypes(self, name, filters, datatype):
    ...some mumbo jumbo...

    default_filter = self._get_default_filters(inputTree, name)

    #default_filter here can be a object of type Filter if defined or None otherwise

    print "RECIEVED " + str(filters)
    if default_filter is not None:
        print "CREATING NEW"
        new_filter = copy.deepcopy(default_filter)
    else:
        print "CREATING NEW"
        new_filter = Filter()
    [new_filter.fields.append(value) for value in filters['fields']]
    [new_filter.operations.append(value) for value in filters['operations']]
    [new_filter.values.append(value) for value in filters['values']]
    print "LENGTH =" + str(len(new_filter.fields))

    ...Some other mumbo jumbo....

因此,基本上我希望将接收到的筛选器值作为filters变量中的参数添加到default_ones中。但我希望在每次调用该方法时都这样做,或者为了更好地解释它,我制作了照片来显示我的问题。所以在第一次方法调用时:

代码语言:javascript
运行
复制
    RECIEVED {'operations': ['!='], 'fields': ['model.DataType.subject'], 'values': ['w']}
    CREATING NEW
    LENGTH =1

因此,正如预期的那样,创建了一个新的过滤器对象,并添加了接收到的参数中的操作、字段和值,长度(字段)= 1。但在我的第二次遍历中:

代码语言:javascript
运行
复制
    RECIEVED {'operations': ['!='], 'fields': ['model.DataType.subject'], 'values': ['']}
    CREATING NEW
    LENGTH =2

现在我不能解释这种行为。如你所见,if的创建新分支被再次调用,filters变量保存了一个项目列表,但结果的长度是2。如果我一次又一次地运行它,它总是会递增。这就像new_filter = Filter()调用返回前一个方法调用中的new_filter一样。是什么导致了这种行为?我在想,如果我做一个new_filter = copy.deepcopy(Filter()),也许可以解决这个问题,但为什么我要被迫这么做呢?

向您致敬,博格丹

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-16 16:37:09

代码语言:javascript
运行
复制
def __init__(self, display_name= "", fields= [], values= [], operations= [])

列表只创建一次。因此,如果您对它们进行修改,则下一次调用将具有修改后的列表。如果您不想要此行为,只需使用None作为默认值,并添加如下内容:

代码语言:javascript
运行
复制
if fields is None:
    fields = []
self.fields = fields

另一种解决方案是创建一个新的列表,不管传递的是什么:

代码语言:javascript
运行
复制
self.fields = list(fields)

http://effbot.org/zone/default-values.htm上也有一篇关于这种行为的详细文章

顺便说一句,你滥用列表理解是不好的。

代码语言:javascript
运行
复制
[new_filter.fields.append(value) for value in filters['fields']]

应该是

代码语言:javascript
运行
复制
new_filter.fields += filters['fields']
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7075533

复制
相关文章

相似问题

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