2

Pythonでは、次のようにリストを変更できます。

In [303]: x = [1,2,3,4,5,6]

In [304]: x[x <= 3]+=3

In [305]: x
Out[306]: [4, 2, 3, 4, 5, 6]

これについては以前から知っていましたが、舞台裏で何が起こっているのか完全には理解していないと思います。誰かが説明する時間を見つけたら、私は感謝します。

In [307]: x = [1,2,3,4,5,6]

In [308]: dis.dis('x[x <= 3]+=3')
          0 SETUP_LOOP      30811 (to 30814)
          3 SLICE+2        
          4 STORE_SUBSCR   
          5 DELETE_SUBSCR  
          6 SLICE+2        
          7 DELETE_SLICE+1 
          8 FOR_ITER        15659 (to 15670)
         11 DELETE_SLICE+1 

In [309]: x
Out[309]: [1, 2, 3, 4, 5, 6]

In [310]: x[x <= 3]+=3

In [311]: x
Out[311]: [4, 2, 3, 4, 5, 6]

In [312]: x<=3
Out[312]: False

In [313]: x[False]+=3

In [314]: x
Out[314]: [7, 2, 3, 4, 5, 6]
4

1 に答える 1

10

x <= 3ブール式です。Pythonでは、boolean型はのサブクラスであるintため、False結果はとして解釈され0、最終的な効果は次のようになります。

x[0] += 3

または、別の方法で示されます。

>>> False == 0
True
>>> True == 1
True
>>> isinstance(False, int)
True

このdis.dis()メソッドは文字列では機能しません。コードオブジェクト(または関数、メソッド、クラス、モジュールなどのコードを含むもの)、またはバイトコードで機能します。文字列をデコードできるように見えるという事実は、偶然の一致です。SETUP_LOOPはオペコード120(のASCII値x)であり、文字列全体がオペコードとオフセットのセットとして解釈されます。

代わりに関数を使用してください:

>>> def foo(): x[x <= 3]+=3
... 
>>> dis.dis(foo)
  1           0 LOAD_GLOBAL              0 (x)
              3 LOAD_GLOBAL              0 (x)
              6 LOAD_CONST               1 (3)
              9 COMPARE_OP               1 (<=)
             12 DUP_TOPX                 2
             15 BINARY_SUBSCR       
             16 LOAD_CONST               1 (3)
             19 INPLACE_ADD         
             20 ROT_THREE           
             21 STORE_SUBSCR        
             22 LOAD_CONST               0 (None)
             25 RETURN_VALUE        
于 2012-10-16T20:17:51.910 に答える