スポンサーサイト

    上記の広告は1ヶ月以上更新のないブログに表示されています。
    新しい記事を書く事で広告が消せます。

    Pythonの変数まとめ

     もともと僕はMelから来た人間なので、Pythonの変数の扱いをMelと同じような感覚でさわって来てた感があったので、改めてちょっとまとめてみます。


    ■Pythonの変数は型宣言がない。
     ・代入する内容に応じて自動的に型が決定します。
    a = 'text'    #str型になる
    b = 2         #int型になる

     はじめはとまどいましたが、慣れると型宣言の方が面倒になってきました・・・
     因みに型を調べたい場合は「type」関数を使います。
    type( a )
    >>> <type 'str'>



    ■ リスト型・タプル型はMELの配列と違い、だたの複数個の値を持てる入れ物。
     ・ここが最初違和感だらけだった部分です。 MELの場合最初に宣言した型の値しか入れられませんが、
      Pythonの場合どのようなオブジェクトでも入れられます。
      当然リストの中にリストも入れられます。ちょっと変数とはそれましたが、
      Mel側では変数の話なんで一緒にまとめておきました。

     と、ここらへんは別段困ることも無く理解できるのですが・・・


    ■変数に入れられたものは右辺のインスタンスである。
     ・一番ひっかかった部分です。今回はこれをメモりたかったがために書いたといっても過言ではないほど、
       Mel使いの僕には意味不だった部分です。

     通常Melでは、変数に入れたものは、宣言した型に従った
    だたの値として格納されているだけです。
    int $a[] = {1, 2, 3};

     こうすれば$aの中には配列{1, 2, 3}と言う値が入ります。さらに
    int $b = $a;

     こうすると、やはり$bには$aの中身、つまり配列{1, 2, 3}と言う値が入ります。
     この$aも$bも、双方値が入っているだけで、互いの変数にはなんの関係性もありません。
    $b[3] = 4;
    //結果
      // $a : {1, 2, 3}
      // $b : {1, 2, 3, 4}



     同様の事をPythonでやると・・・
    ①
    a = [1, 2, 3]
    b = a
    b.append( 4 )
    # 結果
      # a : [1, 2, 3, 4] ← bを編集したのにaも編集されている
      # b : [1, 2, 3, 4]


     この様になるのは「b=a」が、単にaの値をbに代入しているのではなく、bがaのインスタンスになるからです。


     まぁここまでは何となく理解したとしたのに、ここで頭を混乱させられたのが次のケースです。
    ②
    a = 'textA'
    b = a
    a = 'textB'
    # 結果
     # a : 'textA'
     # b : 'textB'

    a の中身が変わってない・・・
     まぁ、理解していれば当たり前の話なんですが、これではbを変えてもaは変わりません。
    理由は簡単、①の例ではaのインスタンスbになっています。
    そしてb.append()はb自身を編集しているため、そのインスタンスであるaも影響を受けているのです。

    ②のケースでもa=bの時点ではbはaのインスタンスになっています。しかし、b='textB'はb自身を編集しているのではなく、'textB'と言う新規strインスタンスを作成している事になるため、aとbとの関係が絶たれてしまうのです。
     この、直接編集と新規インスタンスと言う概念がわかるまで、結構もやもやした気のまま変数を使ってましたorz


    ■そもそもPythonは変数に値を代入するのではなく、オブジェクトのインスタンスを代入している。
     ・上の例とかぶるのですが、Pythonはオブジェクト指向です。
      例えば、一番最初の例
    a = 'text'
    も、MEL的に考えればstring型の値をaと言う変数に代入・・・となるのですが、Pythonではstrと呼ばれるオブジェクトがあり、そのstrオブジェクトのインスタンスを作成し、そのインスタンスの値が'text'であるわけです(たぶん)
     変数aはそのインスタンスを示すラベルみたいなもんです。

     じゃぁ、値とオブジェクトって何が違うのでしょう?
     Melでは値を代入しますが、そもそも値とは文字列だったり数字だったりベクトルだったりマトリックスだったりと、特定の型の値そのものです。

     ところがPythonで代入できるとオブジェクトとは、(ほぼ)全てを指します。
     例えば、Melで言うsize関数「len」の場合
    a = len
    とすると、aはlenオブジェクトのインスタンスとなります。つまりaはlen同じことができるようになります。したがって
    a( [1, 2, 3] )
    >>>3

     また、配列は前述したようにオブジェクトを入れるだけのただの箱なんでこんなこともできます
    import maya.cmds as mc
    def constraint( mode ):
        cmd = [ mc.pointConstraint, mc.orientConstraint, mc.scaleConstraint ]
        cmd[mode]( w=1.0 )
    
    constraint( 2 ) # スケールコンストレインとして機能
    constraint( 0 ) # ポイントコンストレインとして機能
    上記の場合、フラグが一緒なんでできる芸当ではありますが、Melで言うevalみたいにわざわざ文字列に変換しなくてもいいので、場合によっては役立つかも!?

     オブジェクト指向面白いなぁ
    スポンサーサイト

    コメントの投稿

    非公開コメント

    No title

    オブジェクト指向、、愛してます、、、
    もうMELとかで長いプログラム書く気にもなりません。。。
    抽象化万歳・・・

    ②の例、参考になりました!
    たまに、あれ?って思うことがあって、その都度確認したりとかやってるので、こうやってちゃんとまとめてあると助かります:D

    変数に関して、最近読んだHaskellの本に「値に変数をバインドする」と書いてあって、そういう考え方もあるのかと妙に納得したのを覚えています。変数は値を入れる箱のようなもの、と学んできたので、発想が逆なのか、と。
    PythonもHaskellの影響を受けているといいますし、そっちの考え方の方がしっくり来るような気がしています。

    っつってもまぁ僕ごときただの素人なので完全に勘違いしてる可能性もあるのでアレですが・・・


    長文失礼しました・・・。

    No title

    taiさん、こんにちわ

     なんでもオブジェクトってのは、慣れてしまうと非常にわかり易く、応用も利いて素敵ですよね!
    いやぁ楽しい楽しい(^з^)
     ②の例は僕もしょっちゅう混乱してます(笑) 今回まとめてようやく自分でも理解できました・・・

    >>Haskellの話
     なるほど~、確かに値を変数にバインドすると考えると非常に納得がいきますね。MELから入る人は変数=入れ物な方がほとんどだと思うので、こういうオブジェクト指向の概念になると混乱してしまいますよね~
     貴重な情報ありがとうございます! 今まで頭の中で推論の域をでてなかったので、非常にしっくりきました。

     しかし、色々わかってしまうと、ホントMELに戻れんですよね・・・
    プロフィール

    Eske

    Author:Eske
    萌えイラストレーターを目指す3DCGイラストレーター。
    現在ポケモンカードゲーム、ガンダムトライエイジ、ガンダムコンクエスト、妖怪ウォッチとりつきカードゲームなどで3DCGを使用したイラストレーターとして参加中。

    主にここでは日々気づいたメモなんかを残してます。
    イラストのお仕事も受け付けております。ココのメールアドレスからご連絡できますので、お気軽にご相談下さい。

    最新記事
    最新コメント
    カテゴリ
    最新トラックバック
    月別アーカイブ
    検索フォーム
    リンク
    QRコード
    QR
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。