所以我知道在Python中,在方法中声明的变量在其外部是不可见的。但是它们的生命周期是什么呢?我希望每次调用一个方法时,都会创建一个在该方法中声明的变量。
我问你是因为下面的情况。我有一个如下的方法(这与cherrypy一起使用,可能不相关,但我仍然会添加它,以防它以任何方式影响它)。
首先是我使用的自定义过滤器类:
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现在我所说的方法
@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中。但我希望在每次调用该方法时都这样做,或者为了更好地解释它,我制作了照片来显示我的问题。所以在第一次方法调用时:
RECIEVED {'operations': ['!='], 'fields': ['model.DataType.subject'], 'values': ['w']}
CREATING NEW
LENGTH =1因此,正如预期的那样,创建了一个新的过滤器对象,并添加了接收到的参数中的操作、字段和值,长度(字段)= 1。但在我的第二次遍历中:
RECIEVED {'operations': ['!='], 'fields': ['model.DataType.subject'], 'values': ['']}
CREATING NEW
LENGTH =2现在我不能解释这种行为。如你所见,if的创建新分支被再次调用,filters变量保存了一个项目列表,但结果的长度是2。如果我一次又一次地运行它,它总是会递增。这就像new_filter = Filter()调用返回前一个方法调用中的new_filter一样。是什么导致了这种行为?我在想,如果我做一个new_filter = copy.deepcopy(Filter()),也许可以解决这个问题,但为什么我要被迫这么做呢?
向您致敬,博格丹
发布于 2011-08-16 16:37:09
def __init__(self, display_name= "", fields= [], values= [], operations= [])列表只创建一次。因此,如果您对它们进行修改,则下一次调用将具有修改后的列表。如果您不想要此行为,只需使用None作为默认值,并添加如下内容:
if fields is None:
fields = []
self.fields = fields另一种解决方案是创建一个新的列表,不管传递的是什么:
self.fields = list(fields)在http://effbot.org/zone/default-values.htm上也有一篇关于这种行为的详细文章
顺便说一句,你滥用列表理解是不好的。
[new_filter.fields.append(value) for value in filters['fields']]应该是
new_filter.fields += filters['fields']https://stackoverflow.com/questions/7075533
复制相似问题