3 回答
TA贡献1776条经验 获得超12个赞
只需查看文档:
>>> list.count.__doc__
'L.count(value) -> integer -- return number of occurrences of value'
>>> list.append.__doc__
'L.append(object) -> None -- append object to end'
确实没有一种简单的方法可以告诉您,但是:
不可变对象 --> 无法通过方法调用进行更改
因此,例如,tuple没有影响元组的方法,因为它是不可更改的,因此方法只能返回新实例。
而且,如果您“想先看看追加结果如何,然后可以选择是否将其分配给新变量”,则可以将列表与一个具有一个元素的新列表连接起来。
IE
>>> l = [1,2,3]
>>> k = l + [4]
>>> l
[1, 2, 3]
>>> k
[1, 2, 3, 4]
TA贡献1852条经验 获得超1个赞
除了阅读文档(对于某些方法,该方法将包括用于指定返回值的类型注释)或在交互式解释器中使用该方法(包括help()
用于检查文档字符串中的类型注释)之外,不,您不能预先知道只是看方法。
也就是说,您看到的行为是故意的。Python方法要么返回一个新的对象的经修改的拷贝或修改代替对象; 在内置插件中最不重要的,他们从来没有做到既(的一些方法变异的对象,并返回一个非None
数值,但它从来都只是突变的对象;pop
的方法dict
,并list
为这种情况的一个例子)。
这种或/或行为是故意的;如果他们不遵守该规则,那么您将面临一个更加混乱且难以识别的问题,即确定是append
对它所调用的值进行了更改还是返回了一个新对象。您肯定会回来的list
,但是它是新的list
还是一样的list
?如果它改变了它被调用的值,那么
newlist = mylist.append(9)
有点奇怪;newlist
并且mylist
是相同的别名list
(所以为什么要同时使用两个名称?)。您可能暂时不会注意到;您将继续使用newlist
,以为它独立于mylist
,而只是查看mylist
并发现它们全都被弄乱了。通过返回所有此类“就地修改”方法None
(或至少不返回原始对象),可以更快/更轻松地发现错误;如果您尝试使用newlist
,错误地认为它是 a list
,您将立即得到TypeError
s 或AttributeError
s。
基本上,提前知道的唯一方法是阅读文档。对于名称表示修改操作的方法,您可以检查返回值,并经常了解它们是否正在变异。它有助于首先了解哪些类型是可变的;list
,dict
,set
并且bytearray
都是可变的,他们有自己的不可变(除了方法dict
,它没有一成不变的副本)缺乏往往会发生变异的对象到位。
缺省趋向于仅仅因为更有效而使对象在适当位置突变。如果你有一个 100,000 element list
,它的默认行为append
会创建一个新的 100,001 元素list
并返回它会非常低效(并且没有明显的方法可以避免它)。对于不可变类型(例如str
, tuple
, frozenset
),这是不可避免的,如果您想保证对象永远不会就地发生变异,您可以使用这些类型,但这样做的代价是不必要的创建和销毁对象会减慢您的速度大多数情况下的代码。
TA贡献1827条经验 获得超4个赞
只需查看文档:
>>> list.count.__doc__
'L.count(value) -> integer -- return number of occurrences of value'
>>> list.append.__doc__
'L.append(object) -> None -- append object to end'
确实没有一种简单的方法可以告诉您,但是:
不可变对象 --> 无法通过方法调用进行更改
因此,例如,tuple没有影响元组的方法,因为它是不可更改的,因此方法只能返回新实例。
而且,如果您“想先看看追加结果如何,然后可以选择是否将其分配给新变量”,则可以将列表与一个具有一个元素的新列表连接起来。
IE
>>> l = [1,2,3]
>>> k = l + [4]
>>> l
[1, 2, 3]
>>> k
[1, 2, 3, 4]
添加回答
举报