Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python y.extend(z)返回的非类型?_Python_List - Fatal编程技术网

Python y.extend(z)返回的非类型?

Python y.extend(z)返回的非类型?,python,list,Python,List,我试图弄清楚下面的行为。具体来说,在下面的示例中,当我设置y=y.extend(z)时,分配给y的是什么/分配的原因。我可以看出它是一个非类型的对象,我只是不完全明白为什么。例如,这个功能的潜在用途是什么…我看到y.extend(z)是一个就地变异操作——在这种情况下,我目前的想法是,当我尝试将它分配给变量时,我会预期一个错误,而不是返回NoneType。为什么我错了/为什么Python是这样构建的/一个None返回值如何有用 >>> x = [] >>> y

我试图弄清楚下面的行为。具体来说,在下面的示例中,当我设置
y=y.extend(z)
时,分配给y的是什么/分配的原因。我可以看出它是一个非类型的对象,我只是不完全明白为什么。例如,这个功能的潜在用途是什么…我看到y.extend(z)是一个就地变异操作——在这种情况下,我目前的想法是,当我尝试将它分配给变量时,我会预期一个错误,而不是返回
NoneType
。为什么我错了/为什么Python是这样构建的/一个
None
返回值如何有用

>>> x = []
>>> y = []
>>> z = [1, 2]
>>> x.extend(z)
>>> x
[1, 2]
>>> y = y.extend(z)
>>> y
>>> y.extend(z)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'extend'
我现在知道我应该做如下工作:

l = l[:x] + y # where y is already a list

.extend
不返回修改后的数组;它只是就地执行扩展。这意味着将修改
y
,但函数不返回任何内容

>>> y = []
>>> y.extend([1, 2])
>>> y
[1, 2]

列表的extend方法直接修改列表,而不是返回新列表

你应该这么做

y.extend(z)
我看到y.extend(z)是一个就地突变操作,即 在这种情况下,当我尝试将其分配给 变量,不是非类型的返回,不是吗


为什么
extend
不返回任何内容,就Python而言,它返回
None
。将
None
赋值给变量,这在Python中非常好。然后您试图从
None
调用某个内容,这显然是无效的。

可能是重复的,或者您为什么会期望出现错误?为变量指定None是完全有效的。的许多方法,如
list
,在适当的位置修改对象,并且不返回值(这与返回
None
)-
extend()
append()
方法是其中的两种。@NotAnAmbiTurner:我们不删除重复项是有原因的,它们充当规范柱的标志柱。虽然在这种情况下,还有一些地方需要清理。@NotAnAmbiTurner:重复的目的是为了得到规范的答案。这个问题不必是严格的重复,答案仍然是一样的:因为对象在原地发生了变异。
extend
返回None。函数总是返回一个值tho。extend不返回任何内容,因此运行函数的结果是None:PEh这几乎是一样的,但说函数不返回任何内容是不正确的。None是一个值,不管怎样,我都会编辑我的答案。我明白了——但是返回None有什么意义呢?如果我不想给变量赋值,我只会赋值,而不会赋值函数的结果。@NotAnAmbiTurner:因为
list.extend()
会就地修改列表。它不会创建新列表。Python中的惯例是返回
None
,因为您已经有了对该对象的引用。这同样适用于
dict.update()
set.add()
,等等@MartijnPieters这是个好消息——所以我想我的问题是为什么会这样,或者是有原因吗?@NotAnAmbiTurner:请看我对这个问题的评论。
y.extend(z)