思いつくままを綴る雑記帳

久々にハマッタ・・・

Blenderである処理の高速化をしようとPythonでテストコードを書いていたんだけど・・・
久々にハマッタわ・・・・えっ・・・なんでこうなるの?って。

これたぶんバグではなく、仕様のはずなんだけどね。

a = [[]]*5
a[0].append(1)

こうするとaの中身はどうなってると思いますか?
ちなみにaを初期設定した時の状態はこうなってます。
a = [[],[],[],[],[]]
空の配列5個を含む配列ですね。
で、アペンドした結果が
a = [[1],[],[],[],[]]
となっていると思ったあなた・・・・間違いです。
本当は
a=[[1],[1],[1],[1],[1]]
これが正解。
初期設定した時に同じ値を持つデータブロックを参照するように初期設定されるんだろうね。
で、アペンドする前に配列の長さを調べて空配列だったらそのデータの配列を代入するようにすると以後予想通りに使用できると・・・。
書いてたテストコードのどこに間違いがあるんだろうと20, 30分う~んう~んと調べまくってた。
頭でこれ仕様だよね・・と、自信なさげに書いたのはPython3.4/2.7のIDLEで試したけど結果が同じだったので・・。
仕様調べたけど猫さんの調べた範囲ではこれについて書かれている所は分かりませんでした・・・。
以前に投稿した「うねうね」の記事で書いてたWormCurve.pyでfaceが多いobjectだと処理速度がガクッと落ちてたので速度があまり落ちないように改造してた。
これはその時の事です。
猫さん環境で480faceのblendファイルの処理時間と4000faceのblendファイルでの時間を比較してみたんだけど。
勿論毎回同じルートではないのでざっくりした感想ですが、以前のコードより10倍近く処理が速くなった。(4000faceのblendファイル)
まぁ、テストコードだから・・・何の工夫もなくすべきことを都度やってただけだからね・・・。

Blender DevsのBastien Montagne氏が回答が書かれている所を親切に教えてくれた。
Python list of lists, changes reflected across sublists unexpectedly
いやぁ、Pythonの問題でBlenderの問題ではないと思うけどと、BugTrackerを悪用したんだけど・・・。
やっぱりよく知ってるね・・・あの人達は・・・。
スポンサーサイト

コメント

コメントの投稿

URL
コメント

パスワード
秘密
管理者にだけ表示を許可する

トラックバック

トラックバックURL : http://perfectcat.blog101.fc2.com/tb.php/310-cc80ddef
<< 障害物を避けて伸びるCurve object (Reroute) | TOP | Blender Tips(Properties Panel) >>