2016-10-08 15 views
0

タイトルには次のような意味があります。私はなぜ辞書のこのリストの辞書が空であるかについて確信していません。私はリストにそれらを追加する前に辞書を印刷し、それらはすべて4つのキー/値を持っています。なぜこの辞書のリストの空白は空ですか?

コードの「scrappiness」を無視してください。私はいつも基本的にそれを書き出してから洗練するプロセスを踏みます。

コード:

import ntpath, sys, tkFileDialog, Tkinter 
import xml.etree.ElementTree as ET 

class Comparison: 
    def __init__(self, file): 
     self.file = ET.parse(file) 
     self.filename = self.get_file_name(file) 
     self.root = self.file.getroot() 
     self.file_length = len(self.root) 
     self.data_dict = dict() 
     self.master_list = list() 
     self.parse_xml(self.root) 
     print self.master_list 

    def get_file_name(self, file): 
     filename_list = list() 
     for char in ntpath.basename(str(file)): 
      filename_list.append(char) 
      if ''.join(filename_list[-4:]) == '.xml': 
       return ''.join(filename_list) 

    def parse_xml(self, tree): 
     for child in tree: 
      if tree == self.root: 
       self.step_number = child.attrib['id'] 
      self.data_dict['Step'] = self.step_number 
      if len(child.tag) > 0: 
       self.data_dict['Tag'] = child.tag 
      else: 
       self.data_dict['Tag'] = "" 
      if len(child.attrib) > 0: 
       self.data_dict['Attrib'] = child.attrib 
      else: 
       self.data_dict['Attrib'] = "" 
      if child.text is not None: 
       self.data_dict['Text'] = child.text 
      else: 
       self.data_dict['Text'] = "" 
      print self.data_dict 
      print "Step: "+str(self.data_dict['Step']) 
      try: 
       print "Tag: "+str(self.data_dict['Tag']) 
      except: 
       pass 
      try: 
       for key,value in self.data_dict['Attrib'].iteritems(): 
        print "Attrib: "+str(key) 
        print "Attrib Value: "+str(value) 
      except: 
       pass 
      try: 
       if len(str(self.data_dict['Text'])) > 0: 
        print "Text Length: "+str(len(str(self.data_dict['Text']))) 
        print "Text: "+str(self.data_dict['Text']) 
      except: 
       pass 
      print "" 
      print len(self.data_dict) 
      self.master_list.append(self.data_dict) 
      print self.data_dict 
      self.data_dict.clear() 
      if len(child) > 0: 
       self.parse_xml(child) 

if __name__ == "__main__": 
    root = Tkinter.Tk() 
    root.iconify() 
    if sys.argv[1] != "": 
     file_a = Comparison(sys.argv[1]) 
    else: 
     file_a = Comparison(tkFileDialog.askopenfilename()) 
+0

しかし、このscrappinessはわかりにくいです。特に、コードがどのようなことをしているのかという手がかりがない場合でも、 –

+0

インデントをチェックしてください...それらが正しくありません。 –

+0

インデントはSOに貼り付けられた結果であり、コード内には貼り付けられていません。そしてこのコードは小さなXML比較スクリプトの始まりです。コードを読み取るだけでコードの動作を識別するのはむしろ簡単だと思いますが... –

答えて

2

私はあなたがこの意味推測:

print len(self.data_dict) 
self.master_list.append(self.data_dict) 
print self.data_dict 
self.data_dict.clear() 

dictをそれあなたが明確ため空です。 Pythonではすべてが参考になります。

>>> d = {k:v for k,v in zip(range(5),'abcde')} 
>>> id(d) 
140199719344392 
>>> some_list = [] 
>>> some_list.append(d) 
>>> some_list 
[{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e'}] 
>>> id(some_list[0]) 
140199719344392 
>>> d.clear() 
>>> some_list 
[{}] 
>>> 

コピーを追加する場合は、明示的にコピーする必要があります。浅いコピーには、your_dict.copy()を使用してください。

>>> d = {k:v for k,v in zip(range(5),'abcde')} 
>>> d 
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e'} 
>>> id(d) 
140199686153480 
>>> some_list = [] 
>>> some_list.append(d.copy()) 
>>> id(some_list[0]) 
140199719344392 
>>> d.clear() 
>>> some_list 
[{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e'}] 
>>> 
+0

'master_list'に追加してクリアしました。したがって、なぜdictsのリストのdictsが空であるのか不明である - 質問のタイトル。 –

+1

それは*同じdict * –

+0

ですが、私はリストの要素を編集しません、私はdictをクリアします。だから私はそれがそのリストの要素にどのように影響するのか理解していないのですか? –

関連する問題