为什么my_list [None:]和my_list [:None]返回my_list?

时间:2016-06-04 02:42:48

标签: python python-3.x

我今天正在编写一个函数来执行此操作:

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

所以我想知道如果nNone而我my_list[:n]会发生什么。所以我打开了一个REPL,发现了这个:

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]

这是为什么?索引None下的内容无关紧要,甚至没有引起错误?

1 个答案:

答案 0 :(得分:1)

因为my_list[:]会创建列表的副本。 my_list[:None]my_list[None:]myList[None:None]等同于my_list[:]

这个iPython会话应该显示我在说什么:

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

这称为“浅拷贝”运算符。这允许您修改列表的副本而不修改原始文件。