2016-06-04 17 views
1

Ich schrieb heute eine Funktion, dies zu tun:Warum geben my_list [None:] und my_list [: None] my_list zurück?

def foo(n=None): 
    my_list = generate_some_data() 
    return my_list if n is None else my_list[:n] 

So fragte ich mich, was passieren würde, wenn nNone war und ich habe my_list[:n]. Also öffnete ich eine REPL und fand diese:

Python 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:54:25) [MSC v.1900 64 bit (AMD64)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> my_list = [1, 2, 3, 4, 5, 6] 
>>> my_list 
[1, 2, 3, 4, 5, 6] 
>>> my_list[:4] 
[1, 2, 3, 4] 
>>> my_list[:None] 
[1, 2, 3, 4, 5, 6] 
>>> my_list[None:] 
[1, 2, 3, 4, 5, 6] 
>>> my_list[None:None] 
[1, 2, 3, 4, 5, 6] 

Warum ist das? Was passiert unter den Abdeckungen, die Index None spielt keine Rolle, und es verursacht nicht einmal einen Fehler?

+4

Sie haben Ihre Antwort hier http://stackoverflow.com/questions/30622809/python-list-slicing-with-none-as-argument –

Antwort

1

Weil my_list[:] eine Kopie der Liste erstellt. my_list[:None] oder my_list[None:] oder myList[None:None] entsprechen my_list[:].

Diese ipython Sitzung sollte zeigen, was ich rede:

In [73]: myList = [1, 2, 3] 

In [74]: myListReference = myList 

In [75]: myList is myListReference 
Out[75]: True 

In [76]: myList == myListReference 
Out[76]: True 

In [77]: myList is myList[:] 
Out[77]: False 

In [78]: myList == myList[:] 
Out[78]: True 

In [79]: myList is myList[:None] 
Out[79]: False 

In [80]: myList == myList[:None] 
Out[80]: True 

Dies ist die „flache Kopie“ Operator genannt. Auf diese Weise können Sie eine Kopie einer Liste ändern, ohne das Original zu ändern.

Verwandte Themen