パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

Pythonでこういう書き方はしていいんだっけ?」記事へのコメント

  • by Anonymous Coward

    間違いがふたつ有りますね

    1つ目は一行目。正しくは l = "foo bar baz".split(" ") ですね

    2つ目は本題で l = "foo foo foo".split(" ") とすれば直ぐに駄目なことが解ります

    • ・「これはやってもいいんだっけ?」という疑問を持つこと自体が「間違い」
      ・「いろんな要素があるリストの特定の要素だけを削除するコード」をお題にするときは「全部の要素が削除対象」というケースを例に挙げる必要がある

      貴重なご意見ありがとうございました。

      • #3899575 [srad.jp]さんの言いたいことが曲解されてるような気がするのでツッコミます。

        ・「これはやってもいいんだっけ?」という疑問を持つこと自体が「間違い」

        ロジック的にバグってるという「間違い」ですよ。

        ・「いろんな要素があるリストの特定の要素だけを削除するコード」をお題にするときは「全部の要素が削除対象」というケースを例に挙げる必要がある

        貴重なご意見ありがとうございました。

        重要なのは全部fooな事でなく、fooが2連続しているという事です。
        削除漏れが起きるテストパターンの例示ですね。
        原理:foo1個目削除→foo元2個目が1個目になる→次のループで、foo元3個目がfoo2個目として渡ってくる。→foo元2個目が削除されずに残る。
        って事です。

        • by Anonymous Coward

          kei100さんは教えるの下手くそなのでツッコみますね

          L = [1, 2]
          del L[0]
          del L[1]

          この話はこれだけで説明できます。リファレンス参照とか関係無い話はやめましょう

          • ですよねー
            教えるの下手くそですよね。

            リファレンス参照って、Pythonのドキュメント(Forの注釈)を読めって意味だったんですけどね。

            ところで、foreach中にコレクションの要素を削除という、.NETなら例外で落ちる所業 [microsoft.com]してるけど、
            Pythonは例外で死なずに内部カウンタが狂うだけで中途半端に動く&回避策が書いて有るけど関係無いって話なんです?

            • by Anonymous Coward on 2020年10月07日 10時49分 (#3902051)

              あなたの最初のコメントは
              > [:]でコピー作らないと駄目よー
              > 詳しくはリファレンス参照:2.6 [python.org] 3だけど日本語化されてる。中身は同じ [python.org]
              です

              「コピー作らないと駄目よー」って勘違いしてた訳で、それを誤魔化すのは止めましょうよ

              親コメント
              • by kei100 (5854) on 2020年10月07日 13時11分 (#3902128)

                そちらこそ、ちゃんとリンク先の注釈読んでます?

                シーケンス全体のスライスを使って一時的なコピーを作ることで避けられます。

                ディープコピーしてもよいけど、丸ごとスライスする事で、一時コピーをforに渡してるんですよ?
                コピーを渡さないと内部カウンタがずれるので、その事込みでロジックを組まないと削除漏れが起きます。
                # しかも明文化されてない内部仕様に依存するので将来動くかさえ不確実。

                親コメント

皆さんもソースを読むときに、行と行の間を読むような気持ちで見てほしい -- あるハッカー

処理中...