为啥 append() 在 Python 中总是返回 None? [复制]
Posted
技术标签:
【中文标题】为啥 append() 在 Python 中总是返回 None? [复制]【英文标题】:Why does append() always return None in Python? [duplicate]为什么 append() 在 Python 中总是返回 None? [复制] 【发布时间】:2013-05-14 12:21:55 【问题描述】:list = [1, 2, 3]
print(list.append(4)) ## WRONG, print does not work, append() returns None
## RIGHT:
list.append(4)
print(list) ## [1, 2, 3, 4]
我正在学习 Python,但我不确定这个问题是否特定于语言以及append
在 Python 中是如何实现的。
【问题讨论】:
首先,打印附加操作的结果。如果 append() 成功完成,则返回“无”,如遇到的问题:无append
将返回 None
如果它工作。仅此而已。
啊,如果原始代码中的注释提到append
是void
函数,那将更容易理解(至少对我而言)。这是有道理的,谢谢。
大多数标准库使用的约定是,如果一个方法应该就地改变对象,那么它应该返回@ 987654328@。在少数例外情况下,遵循此规则会使代码更难使用(list.pop
就是一个例子)。但这些绝对是例外,而不是规则。
This question 与您提出的问题非常相似。也可以在那里查看答案。
【参考方案1】:
一个建议是避免使用关键字或函数作为变量名。在上面的代码中,您使用 list 作为变量:
list = [1, 2, 3]
我建议不要使用list
作为变量名,因为list 实际上已经定义为内置类型。正如 ChaseTheSun 和 squiguy 指出的那样,没有更多的东西了
lst = [1, 2, 3]
lst.append(4)
print(lst) ## [1, 2, 3, 4]
【讨论】:
小写 L 作为变量名也不好,因为它看起来太像数字 1。我喜欢使用lst
。【参考方案2】:
list.append()
是一个就地操作,意味着它修改了list
的状态,而不是返回一个新的list
对象。
Python 中的所有函数都返回 None
,除非它们明确返回其他内容。 a.append()
方法修改了a
本身,这意味着没有什么可以返回。
查看此行为的另一种方式是sorted(some_list)
和some_list.sort()
之间的差异。
如果您不想将"x"
附加到a
,则需要使用第二个sn-p,或者您可以简单地连接:
>>> a = [1, 2, 3, 4]
>>> b = a[1:] + ["x"]
>>> b
[2, 3, 4, 'x']
进一步澄清:
>>> a = [1, 2, 3, 4]
>>> b = a[1:].append("x")
>>> a
[1, 2, 3, 4]
>>> a[1:]
[2, 3, 4]
>>> type(b)
<class 'NoneType'>
注意b
是None
,因为list.append()
方法返回None
。另请注意,a
实际上并未被修改。这是因为您附加到a
的切片,但实际上并未将该切片保存在任何地方。注意如果你这样做a.append("x")
会发生什么:
>>> b = a.append("x")
>>> a
[1, 2, 3, 4, 'x']
>>> type(b)
<class 'NoneType'>
b
仍然是 None
,但现在 a
已被修改。
【讨论】:
【参考方案3】:它不返回任何东西。它附加/添加到变量,看看你应该使用第一个用于附加打印的变量
friends=["Rajendra V"]
friends.append("John")
print(friends)
【讨论】:
【参考方案4】:append
是一个变异(破坏性)操作(它修改列表而不是返回一个新列表)。进行append
的非破坏性等效操作的惯用方法是
l = [1,2,3]
print l + [4] # [1,2,3,4]
print l # [1,2,3]
回答你的问题,我猜如果append
返回新修改的列表,用户可能会认为它是非破坏性的,即他们可能会编写类似的代码
m = l.append("a")
n = l.append("b")
并期望 n
是 [1,2,3,"b"]
【讨论】:
【参考方案5】:在 Python 中,改变序列的方法返回 None
是一种约定。
考虑:
>>> a_list = [3, 2, 1]
>>> print a_list.sort()
None
>>> a_list
[1, 2, 3]
>>> a_dict =
>>> print a_dict.__setitem__('a', 1)
None
>>> a_dict
'a': 1
>>> a_set = set()
>>> print a_set.add(1)
None
>>> a_set
set([1])
从 Python 3.3 开始,现在更多的是explicitly documented:
一些集合类是可变的。加法、减法、 或重新安排他们的成员,并且不返回特定项目, 永远不要返回集合实例本身,而是
None
。
此设计决策背后的设计和历史常见问题解答gives the reasoning(关于列表):
为什么
list.sort(
) 不返回排序后的列表?在性能很重要的情况下,制作列表的副本 只是为了排序会很浪费。因此,
list.sort()
对 清单到位。为了提醒你这个事实,它不会返回 排序的列表。这样你就不会不小心上当了 当您需要排序副本但还需要保留时覆盖列表 周围未排序的版本。在 Python 2.4 中添加了一个新的内置函数 -
sorted()
。 此函数从提供的迭代创建一个新列表,对其进行排序 并返回它。
【讨论】:
以上是关于为啥 append() 在 Python 中总是返回 None? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥 isset($this->var) 在我的 Codeigniter 模型中总是返回 false?
Python,明明只append了一次,为啥所有子列表都变了啊.jpg
python 'str' object has no attribute 'append'怎么解决