在方法中创建的python方法变量和对象
所以我知道在Python中,在方法中声明的变量在方法外是不可见的。但它们的生命周期是什么?我希望每次调用该方法时都会创建在该方法中声明的变量 我这样问是因为以下情况。我有一个方法如下(这是与cherrypy一起使用的,可能不相关,但我仍然会添加它,以防它以任何方式影响它) 首先是我使用的自定义筛选器类:在方法中创建的python方法变量和对象,python,Python,所以我知道在Python中,在方法中声明的变量在方法外是不可见的。但它们的生命周期是什么?我希望每次调用该方法时都会创建在该方法中声明的变量 我这样问是因为以下情况。我有一个方法如下(这是与cherrypy一起使用的,可能不相关,但我仍然会添加它,以防它以任何方式影响它) 首先是我使用的自定义筛选器类: class Filter(): """ Class used to filter tables displayed in UI, based on few criteria. Initializ
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....
因此,基本上我想将作为过滤器
变量中的参数接收的过滤器值添加到默认值中。但我希望每次调用该方法时都能这样做,或者为了更好地解释它,我制作了打印图来显示我的问题。因此,在第一次方法调用时:
RECIEVED {'operations': ['!='], 'fields': ['model.DataType.subject'], 'values': ['w']}
CREATING NEW
LENGTH =1
因此,正如预期的那样,将创建一个新的过滤器对象,并添加Received参数中的操作、字段和值,长度(字段)=1。但在我第二次通过时:
RECIEVED {'operations': ['!='], 'fields': ['model.DataType.subject'], 'values': ['']}
CREATING NEW
LENGTH =2
现在我无法解释这种行为。如您所见,将再次调用if的CREATING NEW brach,filters
变量保存一个项目列表,但结果的长度为2。如果我一次又一次地运行它,它将始终递增。这类似于new\u filter=filter()
调用从上一个方法调用返回新的\u过滤器。是什么导致了这种行为?我在想,如果我做一个new\u filter=copy.deepcopy(filter())
也许可以解决这个问题,但为什么我要被迫这么做呢
问候,,
博格丹
列表只创建一次。因此,如果您修改它们,下一次调用将具有修改的列表。如果不希望出现这种行为,只需使用None
作为默认值,并添加如下内容:
if fields is None:
fields = []
self.fields = fields
另一个解决方案是创建一个新的列表,不管传递了什么:
self.fields = list(fields)
网站上还有一篇关于这种行为的详细文章
顺便说一句,你对列表理解的滥用是不好的
[new_filter.fields.append(value) for value in filters['fields']]
应该是
new_filter.fields += filters['fields']
列表只创建一次。因此,如果您修改它们,下一次调用将具有修改的列表。如果不希望出现这种行为,只需使用None
作为默认值,并添加如下内容:
if fields is None:
fields = []
self.fields = fields
另一个解决方案是创建一个新的列表,不管传递了什么:
self.fields = list(fields)
网站上还有一篇关于这种行为的详细文章
顺便说一句,你对列表理解的滥用是不好的
[new_filter.fields.append(value) for value in filters['fields']]
应该是
new_filter.fields += filters['fields']
在
def
行上发生的事情不会发生在方法中,而是发生在外部上下文中。在def
行上发生的事情不会发生在方法中,而是发生在外部上下文中。或者更好的做法是,在扩展可能的类型范围时,扩展新的过滤器字段(过滤器['fields'])。使用+=
,您只能将列表添加到其他列表,但使用extend()
您可以使用任何序列类型。感谢您的输入,修复了我的问题。或者更好地使用新的\u filter.fields.extend(filters['fields']),因为它扩展了可能的类型范围。使用+=
,您只能将列表添加到其他列表,但使用extend()
您可以使用任何序列类型。感谢您的输入,修复了我的问题。