12

**kwargsPython では、Python でどのように機能するかを自分で学ぶために、この関数を作成しました。

def fxn(a1, **kwargs):
    print a1
    for k in kwargs:
        print k, " : ", kwargs[k]

次に、この関数を次のように呼び出しました

fxn(3, a2=2, a3=3, a4=4)

Python インタープリターが出力した出力は次のとおりです。

3
a3  :  3
a2  :  2
a4  :  4

最初に a2 を関数に入力したにもかかわらず、for ループが a2 の値の前に a3 の値を出力したのはなぜですか?

4

6 に答える 6

24

kwargs辞書です。辞書は順序付けされていません。簡単に言えば、順序は指定されておらず、実装の詳細です。内部を覗いてみると、アイテムのハッシュ値や挿入の順序などによって順序が大きく異なることがわかります。

于 2012-01-23T19:43:57.997 に答える
11

これは辞書です。また、ドキュメントに記載されているように、辞書には順序がありません( http://docs.python.org/tutorial/datastructures.html#dictionariesから):

ディクショナリは、キーが (1 つのディクショナリ内で) 一意であるという要件を備えた、キーと値のペアの順序付けられていないセットと考えるのが最善です。

ただし、次のように、ある順序で処理することができます。

  • 使用sorted():

    def fxn(a1, **kwargs):
        print a1
        for k in sorted(kwargs): # notice "kwargs" replaced by "sorted(kwargs)"
            print k, " : ", kwargs[k]
    
  • または型を使用して(すべてのキーと値のペアを含むパラメーターとしてオブジェクトをOrderedDict渡すことができます):OrderedDict

    from collections import OrderedDict
    
    def fxn(a1, ordkwargs):
        print a1
        for k in ordkwargs:
            print k, " : ", ordkwargs[k]
    
    fxn(3, OrderedDict((('a2',2), ('a3',3), ('a4',4))))
    
于 2012-01-23T19:44:25.913 に答える
5

残念ながら皮肉なことに、**kwargs の口述化は、次のものが機能しないことを意味します (少なくとも、期待どおりには機能しません)。

od = OrderedDict(a=1, b=2, c=3)

キーワード付き引数は最初に順序付けられていない dict に組み込まれるため、それらがリストされている順序で OrderedDict に挿入されることに依存することはできません。:(

于 2012-01-23T20:29:50.020 に答える
2

kwargsはPythonディクショナリであり、ハッシュテーブルとして実装されているため、その順序は保持されず、事実上ランダムです。

実際、多くのプログラミング言語における最近のセキュリティ問題の修正として、将来的には、プログラムの呼び出し(Pythonインタープリターの呼び出し)間で順序が変わる可能性があります。

于 2012-01-23T19:50:14.347 に答える
1

kwargsは辞書です。Python ではこれらは順序付けされていないため、結果は基本的に (疑似) ランダムです。

于 2012-01-23T19:43:41.877 に答える