なぜ、"変更可能なデフォルトの引数の修正"としての構文はうろうpythonのピ

StackOverflow https://stackoverflow.com/questions/2639915

  •  27-09-2019
  •  | 
  •  

質問

現在以下の 私シリーズの"python留守に関する問い合わせ先> に基づき 他の質問.

特権

http://python.net/~goodger/プロジェクト/pycon/2007年/idiomatic/評価します。html#その他の言語について-変数 や画面の"デフォルトのパラメータの値は常にnullとなりますができます:

def bad_append(new_item, a_list=[]):
    a_list.append(new_item)
    return a_list

def good_append(new_item, a_list=None):
    if a_list is None:
        a_list = []
    a_list.append(new_item)
    return a_list

"重要な警告"をpython.org この非常に同じに、カントになっていると"ますよ。

一つ何かをやりたくて仕方がなか

なので、質問はこちら:なぜそのような "良好な"構文上の既知の問題 醜いようなプログラミング言語 の推進"エレガント構文"と"使いやすい"?

編集:

別の何かをやりたくて仕方がなか

ませんか なぜかそういうこ (感謝をしている。

思い なぜな簡単な代替蔵の言語.

と思うようとしてるようには見えないのでしょうができるというもの def 自身の名を引数を付ける"地方"は、"新しい"内の def, な可変オブジェクトです。のようなもの:

def better_append(new_item, a_list=immutable([])):
    a_list.append(new_item)
    return a_list

思いつくのより良い書式では、がんも推測が必要になり非常に良い説明がなぜこなしています。

役に立ちましたか?

解決

デフォルトの引数が評価しているのは def 文が実行されると、おそらく最も合理的なアプローチ:うえました。がんの原因となり混乱した場合の結果、環境が変わります。

差別化と魔法の local の方法いのも長いのもどっちも似合いのは理想的です。Pythonによるものか平野にあり、クリアーの交換は、現在の定型なリゾートゴにあることなどからの一貫した意味Python現します。

他のヒント

これを変更可能なデフォルトトラップ'.参照: http://www.ferg.org/projects/python_gotchas.html#contents_item_6

基本的には、 a_list が初期化され、プログラムが最初に解釈され、各時間を呼び出す機能としてあなたが期待するかもしれなのか。いずリストの各時間を呼び出す機能がんを再利用することが最適です。

しないといけないのではないかという疑問への答えはしたい場合は追加え、リスト、だけでなりませんが、機能のことを思い出します。

この:

>>> my_list = []
>>> my_list.append(1)

がより明確であると読みやすくなりより:

>>> my_list = my_append(1)

の実践の場合、要望の受け入れが大変良いと思いこのような動きかを自分のクラスのメソッドを管理するための内部一覧です。

非常に特定の使用の場合の機能をまとめて見ることができる オプショ パスリストの変更が発生し新規リストのない限り、具体的にはいパスワがあるのですが、プライベートビーチがあり、特例syntax.本気であれば、数多くの通話機能は、なぜったい特別の場合の最初の呼び出しのシリーズ(試みの一つの引数)と区別するために毎その他一または二引数にすることも可能で豊かに、既存のリスト)?!E.g.) 考えるようなものを想定のコース betterappend かった何かと便利で、現在の例で狂を呼んでい代わりに直接 .append!-):

def thecaller(n):
  if fee(0):
    newlist = betterappend(foo())
  else:
    newlist = betterappend(fie())
  for x in range(1, n):
    if fee(x):
      betterappend(foo(), newlist)
    else:
      betterappend(fie(), newlist)

この狂った、 明らかに する代わりに、

def thecaller(n):
  newlist = []
  for x in range(n):
    if fee(x):
      betterappend(foo(), newlist)
    else:
      betterappend(fie(), newlist)

ものの二つの引数を避ける繰り返し、より簡単なロジック

導入の特例文 の特殊なケース入りを使用の場合、あんな感覚を促すためには、これを支える非常に独特のひとつは、既存の完全正規の構文は、イブレア城、イブレアの使用の場合は非常に珍しい 良い 用途-).

私はこの答えを考えから多くのコメント掲載の問題をもたらしていました。

この例では 欠陥のある.Itを変更すると、リストを渡ししますので、副作用があります。この方法で目的の機能に作業するのではなく、意味においてデフォルトの引数に使います。もう意味での更新されます。なくデフォルトの引数の問題を受け始めました。

ばにしたかったのを返し新たなリストを聞くことができ コピー の入力一覧です。Python好むと見えづらい場合があります明示的なので、しだいにコピーします。

def better_append(new_item, a_list=[]): 
    new_list = list(a_list)
    new_list.append(new_item) 
    return new_list 

めっきの発生させる装置きリストまたは発電機として入力:

def generator_append(new_item, a_list=[]):
    for x in a_list:
        yield x
    yield new_item

と思うんぬのPythonの扱いの変更可能な、不変のデフォルトの引数のうことになるだけで成り立ちません。この不変性を引きの変更コード、微妙な物ます。お取りの例でにお申し込みの文字列ではなく、リスト:

def string_append(new_item, a_string=''):
    a_string = a_string + new_item
    return a_string

このコードは変わらない渡された文字列することはできない文字列は不変です。するための新しい文字列、および譲a_stringる新しい文字列になります。デフォルトの引数に使用できるまで変更等はできませんので、あなたの写しをしていきたいと思っています。

どなかった場合は話したリストが約AwesomeSets、クラスだ。いすを定義したい場合".地方に" すべてのクラス?

class Foo(object):
    def get(self):
        return Foo()
    local = property(get)

かがくの古本当に速います。しかし、"場合にはNone:a=CorrectObject()"パターンがとれ、しかできない醜い--だが明快で、興味深いものでした。

問題はないといけない書式が一つの意味の値のデフォルトパラメータを評価している関数定義、な機能の実行。

うべきではないの定義この二つの機能としています。利用できる世界初のリストや辞書のために場所の変更に対応するオブジェクト。この方法で頭痛がなんか変更可能なオブジェクトの入った仕事がきれいではないでしょうかはOKと思います。

そして二つの異なる方法でパスパラメータを異なる行動です。これは良くないと感じているのです。

んく優雅な文法と語はするべきではないということ。Python構文を伝え両方のアプローチを明確にするだけで起こることは、正しいアプローチが少な優雅な(ラインの書式)以上の誤ります。だから、誤ったアプローチです。設備は、施設内または近辺にも優雅さは関係ありません。理由としては、ものように実演するbetter_appendが実施したものではないでしょうかを There should be one-- and preferably only one --obvious way to do it. trumps未利益をエレガンスに仕上げている。

このようgood_append()、IMO(国際海事機関:

def ok_append(new_item, a_list=None):
    return a_list.append(new_item) if a_list else [ new_item ]

きものには十分注意してやることを確認a_listしたリスト...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top