3

新しい仕事を始める前にPythonを独学しています。これは Django の仕事なので、2.7 に固執する必要があります。そのため、Hetland によるBeginning Pythonを読んでいますが、スライスを使用して機能を複製する彼の例を理解していませんlist.extend()

まず、彼はextend方法を次のように示します。

a = [1, 2, 3]
b = [4, 5, 6]
a.extend(b)

生産する[1, 2, 3, 4, 5, 6]

次に、スライスによる拡張のデモンストレーションを介して

a = [1, 2, 3]
b = [4, 5, 6]
a[len(a):] = b

最初の例とまったく同じ出力が生成されます。

これはどのように作動しますか?A の長さは 3 で、終端のスライス インデックス ポイントは空で、リストの最後まで実行されることを示します。値はどのようにbに追加されaますか?

4

4 に答える 4

1

これは、通常のインデックス作成の単純な拡張です。

>>> L
[1, 2, 3, 4, 5]
>>> L[2] = 42
>>> L
[1, 2, 42, 4, 5]

この__setitem__()メソッドは、通常のインデックスの代わりにスライスが使用されていることを検出し、適切に動作します。

于 2013-05-18T18:00:29.910 に答える
0

デモンストレーションとして、 のサブクラスを見ることを検討してlistください。

from __future__ import print_function     # so I can run on Py 3 and Py 2

class EdList(list):
    def __setitem__(self,index,value):
        print('setitem: index={}, value={}'.format(index,value))
        list.__setitem__(self,index,value)    
        print(self)

    def __setslice__(self,i,j,seq):
        print('setslice: i:{}, j:{}, seq:{}'.format(i,j,seq))
        self.__setitem__(slice(i,j),seq)

Python 3 で実行:

>>> a=EdList(range(10))
>>> a[300000:]=[1,2,3]
setitem: index=slice(300000, None, None), value=[1, 2, 3]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3]
>>> a[1:1]=[4,5,6]
setitem: index=slice(1, 1, None), value=[4, 5, 6]
[0, 4, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3]

Python 2 での実行:

>>> a=EdList(range(10))
>>> a[300000:]=[1,2,3]
setslice: i:300000, j:9223372036854775807, seq:[1, 2, 3]
setitem: index=slice(300000, 9223372036854775807, None), value=[1, 2, 3]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3]
>>> a[1:1]=[4,5,6]
setslice: i:1, j:1, seq:[4, 5, 6]
setitem: index=slice(1, 1, None), value=[4, 5, 6]
[0, 4, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3]

初めて学ぶときは戸惑いますが、きっと好きになると思います。

于 2013-05-22T00:16:17.337 に答える