中創建的對象所以我知道在Python中,在方法中聲明的變量在其外部是不可見的。但他們的生命週期是什麼?我期望每次調用方法時都會創建一個在方法中聲明的變量。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的CREATING NEW brach,filters
變量保存一個項目列表,但結果的長度是2.如果我一再運行它,它將始終增加。這就像new_filter = Filter()
調用返回上一個方法調用的new_filter。什麼導致了這種行爲?如果我做了new_filter = copy.deepcopy(Filter())
它可能會解決它,但我爲什麼要被迫這麼做呢?
問候, 波格丹
在'def'線會發生什麼情況的方法不會發生,它發生在外部環境。 – agf