Oh 脳《143》続・ようこそ Python のトワイライトゾーンへ
‖記事一覧‖Oh 脳: after ZERO《其之佰肆拾参》
続・ようこそ Python のトワイライトゾーンへ… (@,@)
♪セミナーの枕で紹介した小ネタ集です。息抜きや話題作りにどうぞ (^.^)
Python には、知る人ぞ知る、さまざまなトワイライトゾーンが存在します。
今回は、その続編として、次の話題を紹介(再掲)します。
- 2006-01-16 Python.use(better) #OOP:識別性〔identity〕
- 2006-01-24 Python.use(better) #OOP:識別性 -- 関数オブジェクト
(中略)
■ 発展課題
同じ値を持つ整数リテラルに対して、次のように、
>>> x, y = 256, 256 >>> x is y True >>> x, y = 257, 257 >>> x is y False複数の異なるオブジェクトが生成されることがあります。この状況は、Python のバージョンの違い、また Jython/IronPython でも異なります。そこで、この境界値(ここでは 256,257)を検出するプログラムを作成してください。
《hint》Jython2.5 では、次のように、
>>> x = 899 >>> y = 899 >>> x is y True >>> x = 900 >>> y = 900 >>> x is y Falseその境界値(ここでは 899,900)が、Python3.1 とは異なります。
□
《note》詳細は、中級編「ソースコードの歩き方」で解説します。
(中略)
lambda 式は、名前を持たない関数オブジェクトを参照する、直接的な手段を提供します。式は(lambda 式に限らず)リテラル表現に代えて、オブジェクトを参照する手段のひとつを提供します。例えば、
>>> id(7) 3483872 >>> id(3+4) 3483872リテラル表現 7 と式 3+4 とは、どちらも同じ「整数」オブジェクト 7(id:3483872)を参照します。このように、オブジェクトを参照(表現)するには、次の3つの手段があります。
- リテラル
- 変数
- 式
《oops》Python3.1 の隘路
>>> 3.__add__(4) # (x.x) ... too bad SyntaxError: invalid syntax (, line 1) >>> 3.0.__add__(4) 7.0 >>> n = 3 >>> id(n.__add__(4)) 3483872 残念ながら、Python3.1 では、リテラル表現(整数オブジェクト)に対するメソッド呼び出しは、構文規則に違反すると見なされ、例外 SyntaxError を生成します。リテラル表現(実数オブジェクト)に対するメソッド呼び出しは有効です。この問題を解消するために変数を利用できますが、他の「純粋な OOP 言語」と肩を並べるために、Python が越えなければならない壁のひとつかもしれません。