2015-12-12 12 views
5

私は質問するにはちょっと変わった質問だと思います。
私はジャンゴコードのいくつかの部分を勉強していたが、私はこれまで見たことがないものを見つけた。
Copy Difference QuestionIt's usage in dictionaryによれば、同じ参照で2つの辞書を作成できます。ディクショナリシャローコピーを自分自身に設定するのはなぜですか?

質問は、辞書の浅いコピーをそれ自身に設定する目的は何ですか?
コード:

class BaseEngine(object): 

    # Core methods: engines have to provide their own implementation 
    #    (except for from_string which is optional). 

    def __init__(self, params): 
     """ 
     Initializes the template engine. 
     Receives the configuration settings as a dict. 
     """ 
     params = params.copy() 
     self.name = params.pop('NAME') 
     self.dirs = list(params.pop('DIRS')) 
     self.app_dirs = bool(params.pop('APP_DIRS')) 
     if params: 
      raise ImproperlyConfigured(
       "Unknown parameters: {}".format(", ".join(params))) 

辞書def __init__(self, params):paramsがコピーされます。

django.template.backends.base

params = { 
    'BACKEND' = 'Something', 
    'DIRS' = 'Somthing Else', 
} 
params = params.copy() 

答えて

5

関連部分またはdjango.template.backends.base.pyは、このようになります〜新規辞書params = params.copy()。それはちょうど同じ名前を使用します。したがって、古いオブジェクトには、この名前を使用してアクセスすることはできません。次のステップでは、新しいローカルディクショナリは変更されますが、元のディクショナリは変更されません。

self.params = paramsの代わりに、params = params.copy()の代わりに非常に異なる効果があります。この場合、self.paramsは、paramsの背後にあるオブジェクトのちょうど2番目の名前になります。それは辞書であり、変更可能であるため、self.paramsへのすべての変更はparamsになります。 params.pop('NAME')は、キーNAME' を辞書から削除します。実際には、それが空であるというチェックがあります:params.pop('NAME')。 `self.params = params` が代わりに:さてあなたは、私は、彼らはそれを使用するために辞書をコピーし理解して言ったことから

+0

ではなく、なぜいないので、それを変更するには? – Heartagramir

+0

彼らはそれを変更します。私の答えにこれに関するセクションを追加しました。 –

+0

今私はそれを持っている... それを変更せずにdictを使うために私たちはcopy()を使う。 これはすべてではありません... self.paramsはクラスの新しい変数を作成しません... varをコピーして特定のオブジェクト内で使用し、それと同じオブジェクトです。 – Heartagramir

関連する問題