2011-01-03 3 views
1

헤이 모두, 내가 확인을 heres를 heres .. 테이블 만 일어나고 매우 뭔가 이상한의 종류를 구성하기 위해 사전을 사용하는 클래스를 만들어 내 코드설명 할 수없는 파이썬 딕셔너리 문제

class dbase: 
    def __init__(self): 
     self.rows = {} 
     self.cols = {} 
    def addrow(self, name): 
     self.rows[name] = self.cols 
    def addcol(self, name): 
     for x in self.rows: 
      self.rows[x][name] = None 
    def printit(self): 
     for x in self.rows: 
      print x, self.rows[x] 
a = dbase() 
a.addrow("coke") 
a.addcol("price") 
a.printit() 
a.addrow("sprite") 
a.printit() 

을 시도하고 이상한에게 맡은 일. 내 프로그램은 스프레드 행을 "price"값을 가진 내부 사전을 가지고 있지만 내 프로그램에서는 어디에도 말하지 않았다. self.cols [ "price"] = None 그래서 스프라이트에 대한 addrow 함수가이 내부 사전을 그 안에 넣는다. ? 어떤 도움

+2

http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-languages-have-variables 전체'self.rows [x]'는 같은 객체'self를 참조하십시오. . 콜스. – jfs

+1

"아니요. 내 프로그램에서 어디서 그런 말을 했나요?'self.cols ["price "] = None'"예, 있습니다. self.rows [x] [name] = None'은 self.rows [x]가 이전에 self.cols로 설정 되었기 때문에 정확하게 말합니다. –

+0

새로운 스타일의 클래스를 사용하십시오 – Ant

답변

2

의 모든 값에는 self.cols이 할당되어 있으므로 은 동일한 사전을 키로 할당합니다. self.rows[x]을 수정하면 이 같은 개체이기 때문에 self.rows[y]도 수정합니다. 마찬가지로 self.rows[z]의 값으로 self.cols을 다시 추가하면 여전히 동일한 개체이므로 모두 동일한 내용을 갖습니다.

매번 행마다 별도의 빈 dict를 작성하려면 : {}으로 지정하십시오.

하지만 처음에는이 클래스가 필요하지 않습니다. 자연스럽게 파이썬에서 직접 수행되는 것을 위해 커스텀 인터페이스를 사용하게되었습니다. 아마 collections.defaultdict도 조사해야합니다.

1

에 대한 덕분에 당신은 None 동일한으로 설정, 코드가 self.rows[x][name] 수정 a.addcol("price")를 호출 할 때.

은 dict {'price': None}과 동일하게 설정됩니다. self.rows[x]은 각각 self.cols으로 설정되므로 매번 동일한 dict이 인쇄됩니다.

4

와우. 이것은 잠시 동안 본 메시 코드입니다. 행을 추가 할 때마다 다른 모든 열과 동일한 사전을 추가하는 것입니다. 파이썬은 당신이 당신이 그것을 업데이트 업데이트 참조, 언제나처럼이 문제를 처리하기 때문에 -

def __init__(self): 
    self.rows = {} 
    self.cols = {} 
def addrow(self, name): 
    self.rows[name] = self.cols 

나는 당신이 항상 self.cols를 참조하십시오, 당신은 행에 대해 열을 설정할 때

def addrow(self, name): 
    self.rows[name] = {} 
0

을 의미 생각 그 참조를 가리키는 모든 것.

각 행마다 다른 열 집합이 필요하면 매번 적절한 값으로 초기화해야합니다.

0

항상 같은 사전 인스턴스를 재사용하고 있습니다.

def addrow(self, name): 
    self.rows[name] = self.cols 

변수와 관련하여 파이썬은 Java와 비슷합니다. 각 이름은 객체 인스턴스에 대한 참조 일뿐입니다. 변수 할당이 거의 항상 을 의미하는 C 에서처럼 값을 복사하는 것과는 다릅니다.당신이 행과 열에 대한 빠른 앤 더러운 테이블 클래스를 만들려면

, 당신은 예를 들어, defaultdict의 사용을 만들 수 :

from collections import defaultdict 

class RowsAndColumns: 
    def __init__(self): 
     self._rows = defaultdict(dict) 

    def get(self, row, col): 
     return self._rows[row][col] 

    def set(self, row, col, value): 
     self._rows[row][col] = value 

matrix = RowsAndColumns() 
matrix.set("Coke", "Price", 1.99) 
print matrix.get("Coke", "Price") # 1.99 
print matrix.get("Pepsi", "Price") # KeyError "Price" 
0

이 작업을 수행하는 가장 쉬운 방법은 단지를 가지고있다 사전 목록. 이 같은 :

# A new "database" 
dbase = [] 
# Adding a new "row". 
dbase.append({}) 
# Adding columns to a specific row: 
dbase[0]['newcol'] = "The value" 
# Retrieving a colum from a row which will raise a KeyError if the column doesn't exist: 
dbase[0]['newcol'] 
# Retrieving a colum from a row which will return None if the column doesn't exist: 
dbase[0].get('anothercol') 

또한 DefaultDict에서 볼 수 있지만 표준 사전 및 개체가 먼저 작동하는 방법을 배우는 것이 좋습니다.

관련 문제