2

我刚刚遇到了这种我无法理解的情况:

In [3]: nk1=range(10)

In [4]: nk2=range(11,15)

In [5]: nk1.extend(nk2)

In [6]: nk1
Out[6]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14]

In [7]: dir(range(10))==dir(list)==dir(range(11,15))==dir(nk1)==dir(nk2)
Out[7]: True

In [8]: print range(10).extend(range(11,15))
None

正如你在上面看到的,我可以很容易地扩展 nk1,但为什么不是最后一个返回的语句None
为什么它NoneIn[8]输入中返回(而In[7]我们可以看到一切都是一样的)???
所以我总是必须做实例range来扩展它???

来自 python 文档;我找到了这个;但我不知道上述情况是如何发生的。

4

2 回答 2

5

当您扩展列表时,列表会被原地修改。不返回新列表。

就地修改表明您正在调用其方法的对象将在该方法执行期间对其自身进行更改。在大多数情况下(为了避免您当前遇到的混淆),这些类型的操作不会返回执行操作的对象(尽管有例外)。考虑以下:

list1 = range(10)
list2 = range(10) + range(11,15) # no in place modification here.
nolist1 = list1.extend(range(11,15)) # list1 is now (0 ... 14)
nolist2 = range(10).extend(range(11,15)) # Nothing actually happens here.

在最后一个示例中,该range函数返回一个从未分配给任何东西的列表。然后扩展该列表,其结果是返回值None。这是打印出来的。

于 2013-01-07T04:38:56.233 回答
0

range()给出新创建列表的句柄。如果你需要修改它,你必须将句柄存储到一个变量中。

它没有打印“无”,因为extend不返回任何内容。当您使用 range() 时,无法直接获取输出。

nk1 = range(10)
nk1.extend(range(11,15))
print nk1
于 2013-01-07T04:45:52.550 回答