Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在方法中创建的python方法变量和对象_Python - Fatal编程技术网

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

在方法中创建的python方法变量和对象,python,Python,所以我知道在Python中,在方法中声明的变量在方法外是不可见的。但它们的生命周期是什么?我希望每次调用该方法时都会创建在该方法中声明的变量 我这样问是因为以下情况。我有一个方法如下(这是与cherrypy一起使用的,可能不相关,但我仍然会添加它,以防它以任何方式影响它) 首先是我使用的自定义筛选器类: class Filter(): """ Class used to filter tables displayed in UI, based on few criteria. Initializ

所以我知道在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....
因此,基本上我想将作为
过滤器
变量中的参数接收的过滤器值添加到默认值中。但我希望每次调用该方法时都能这样做,或者为了更好地解释它,我制作了打印图来显示我的问题。因此,在第一次方法调用时:

    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()
您可以使用任何序列类型。感谢您的输入,修复了我的问题。