我今天正在编写一个函数来执行此操作:
def foo(n=None):
my_list = generate_some_data()
return my_list if n is None else my_list[:n]
所以我想知道如果n
是None
而我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
下的内容无关紧要,甚至没有引起错误?
答案 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
这称为“浅拷贝”运算符。这允许您修改列表的副本而不修改原始文件。