2011-01-30 5 views
73

어쨌든, 아래의 노드 클래스에서 wordList 및 adjacencyList 변수는 Node의 모든 인스턴스간에 공유됩니다.파이썬 생성자 및 기본값

>>> class Node: 
...  def __init__(self, wordList = [], adjacencyList = []): 
...   self.wordList = wordList 
...   self.adjacencyList = adjacencyList 
... 
>>> a = Node() 
>>> b = Node() 
>>> a.wordList.append("hahaha") 
>>> b.wordList 
['hahaha'] 
>>> b.adjacencyList.append("hoho") 
>>> a.adjacencyList 
['hoho'] 

내가 생성자 매개 변수의 디폴트 값 (이 경우 빈 목록)을 계속 사용할 수 있지만, 자신의 단어 목록과 인접리스트 변수를 가지고 A와 B 모두를 얻을 수있는 방법이 있나요?

저는 python 3.1.2를 사용하고 있습니다.

+1

가능한 중복 http://stackoverflow.com/questions/2681243/how-should-i-declare-default-values-for- instance-variables-in-python) –

+0

파이썬에서 [최소 경악 (Least Astonishment)]의 가능한 복제본 : 어느 범위가 가변 기본값 인수입니까?] (http://stackoverflow.com/questions/1132941/least-astonishment-in-python -which-scope-is-the-mutable-default-argument-in) –

답변

91

변경 가능한 기본 인수는 일반적으로 원하는 것을 수행하지 않습니다. 대신,이 시도 :

class Node: 
    def __init__(self, wordList=None, adjacencyList=None): 
     if wordList is None: 
      self.wordList = [] 
     else: 
      self.wordList = wordList 
     if adjacencyList is None: 
      self.adjacencyList = [] 
     else: 
      self.adjacencyList = adjacencyList 
+20

이것들은 한 줄짜리 일 수도있다 :'wordList가 None else []'이 아닌 경우에는'self.wordList = wordList , 약간 덜 안전하다.'self.wordList = wordList 또는 []'. –

+1

이것은 Pythonic 방식으로 간주되지만, "특별한 경우가 충분히 특별하지 않기"때문에 krousey의 방식을 선호합니다. –

+0

@ JoshBleecherSnyder 나는 손가락을 그 위에 올려 놓을 수 없었습니다. – markdsievers

15

나는 시도 할 것이다 :

self.wordList = list(wordList) 

대신 같은 객체를 참조의 복사본을 만들기 위해 강제로.

+1

단순함을 위해서 : – Hery

23

이의 여기에서 무슨 일이 일어나고 있는지 설명하자

Python 3.1.2 (r312:79147, Sep 27 2010, 09:45:41) 
[GCC 4.4.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> class Foo: 
...  def __init__(self, x=[]): 
...   x.append(1) 
... 
>>> Foo.__init__.__defaults__ 
([],) 
>>> f = Foo() 
>>> Foo.__init__.__defaults__ 
([1],) 
>>> f2 = Foo() 
>>> Foo.__init__.__defaults__ 
([1, 1],) 

당신은 기본 인수가 해당 함수의 속성입니다 튜플에 저장되어있는 것을 볼 수 있습니다. 이것은 실제로 해당 클래스와 아무 관련이 없으며 모든 기능을 수행합니다. 파이썬 2에서, 속성은 func.func_defaults이 될 것입니다.

다른 포스터가 지적한 것처럼,을 센티넬 값으로 사용하고 각 인스턴스에 자체 목록을 제공하려고합니다.

11
class Node: 
    def __init__(self, wordList=None adjacencyList=None): 
     self.wordList = wordList or [] 
     self.adjacencyList = adjacencyList or [] 
[I 파이썬에서 인스턴스 변수에 대한 기본 값을 선언해야 어떻게?] (의