2016-08-19 4 views
9

をスライスして拡張対基本的な私は、Python 2.7で奇妙な行動に気づいた:パイソン - スライスを使って実験すると

class A: 
    def __getitem__(self, i): 
     print repr(i) 
a=A() 
a[:] #Prints slice(0, 9223372036854775807, None) 
a[::] #prints slice(None, None, None) 
a[:,:] #prints (slice(None, None, None), slice(None, None, None)) 

カッコ内の1つのコロンを使用する場合は、スライスオブジェクトを開始し、として巨大な整数として0を持っています終わり。ただし、複数のコロンを使用すると、指定されていなければ、開始と停止はNoneになります。

この動作は保証されているか、実装固有ですか?

Documentationは、2番目と3番目のケースが拡張スライスであるとしていますが、最初のケースはスライディングではありません。しかし、私は基本と拡張スライスの違いについて明確な説明が見つかりませんでした。

__getitem__を無効にして、拡張スライスを受け入れる場合は、私が知っておくべき他の「特殊なケース」がありますか? Pythonの2 [:]については

+0

Python 2.7では '2147483647'(2^31-1)となり、値はシステム固有のものです。 Python 3では、すべてのケースで 'None'を取得します。 –

+3

'A'を新しいスタイルのクラスにすると' None'に変わります。 –

答えて

10

はまだ(非推奨)__getslice__(self, i, j)を呼び出し、これはデフォルトのパラメータで呼び出されたときにスライスslice(0, sys.maxsize, None)を返すために文書化されている:スライス式でiまたはjの欠落がゼロに置き換えていることを

注意またはsys.maxsize、...

(強調鉱山)。何__getslice__()が見つからない場合 新しいスタイルのクラスは、デフォルトで__getslice__()を実装していないので、

、スライスオブジェクトが代わりに作成され、代わりに__getitem__()に渡されます。

Python 3は__getslice__()をサポートしていません。上記のすべてのスライス式のオブジェクトはconstructs a slice()です。

注:とslice()は、デフォルトとしてNoneを持っているスライスは、次の3つの方法で独占的に行われています。

a[1:2] = b

のような呼び出しが

a[slice(1, 2, None)] = b

などに変換されます。欠落したスライスアイテムは常にNoneで埋められます。

関連する問題