2011-08-16 3 views
1

그래서 파이썬에서는 메서드에서 선언 된 변수가 메서드 외부에서 볼 수 없다는 것을 알고 있습니다. 그러나 그들의 생활주기는 무엇입니까? 메서드 내에서 선언 된 변수는 해당 메서드가 호출 될 때마다 만들어지기를 기대합니다.파이썬 메서드 변수 및 메서드에서 만든 개체

다음과 같은 이유로 문의하고 있습니다. 나는 다음과 같은 방법을 사용한다 (이것은 체리 피와 함께 사용된다. 아마도 관련이 없지만, 어떤 식 으로든 영향을 줄 수있는 기회를 위해 추가 할 것이다). 내가 사용

먼저 사용자 정의 필터 클래스 : 이제

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 

방법 I에 대한

@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의 새 brach 만들기가 다시 호출됩니다. filters 변수는 하나의 항목 목록을 보유하지만 결과 길이는 2입니다. 반복해서 실행하면 항상 증가합니다. new_filter = Filter() 호출이 이전 메서드 호출에서 new_filter를 반환하는 것과 같습니다. 이런 종류의 행동을 일으키는 원인은 무엇입니까? 나는 new_filter = copy.deepcopy(Filter())으로 해결할지도 모르지만 그렇게해야만하는 이유는 무엇입니까?

감사 보그 단이 목록은 한 번만 만들어

+1

, 그것은 외부 환경에서 발생해야한다. – agf

답변

5
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']] 

방법에서 발생하지 않는`def` 라인에 어떻게됩니까
new_filter.fields += filters['fields'] 
+6

또는 new_filter.fields.extend (필터 [ 'fields'])가 가능한 유형 범위를 확장하므로 더 좋습니다. '+ ='를 사용하면 목록을 다른 목록에만 추가 할 수 있지만'extend()'를 사용하면 모든 시퀀스 유형을 사용할 수 있습니다. – glglgl

+0

입력 해 주셔서 고맙습니다. 제 문제가 해결되었습니다. – Bogdan

관련 문제