<p>除了阅读文档(对于某些方法,它将包含指定返回值的类型注释)或在交互式解释器中使用方法(包括使用<code>help()</code>检查docstring中的类型注释)之外,不,您不能仅仅通过查看方法就预先知道。你知道吗</p>
<p>也就是说,你看到的行为是故意的。<strong>Python方法<em>要么返回对象的<em>新的</em>修改过的副本<em>要么</em>就地修改对象;至少在内置方法中,它们从不同时执行这两个操作(有些方法会修改对象并返回一个非<code>None</code>值,但它决不是刚刚修改过的对象;<code>dict</code>和<code>list</code>的<code>pop</code>方法就是一个例子本案中)。你知道吗</p>
<p>这种非此即彼的行为是有意为之的;如果他们不遵守这条规则,那么您将遇到一个更容易混淆和难以识别的问题,即确定<code>append</code>是否改变了调用它的值,或者返回了一个新对象。你肯定得到了一个<code>list</code>,但它是一个新的<code>list</code>还是相同的<code>list</code>?如果它改变了所调用的值</p>
<pre><code>newlist = mylist.append(9)
</code></pre>
<p>有点奇怪;<code>newlist</code>和<code>mylist</code>是同一个<code>list</code>的别名(为什么两个名字都有?)。你可能一段时间都没有注意到;你会继续使用<code>newlist</code>,以为它独立于<code>mylist</code>,结果看到<code>mylist</code>就发现一切都搞砸了。通过让所有这些“modify in place”方法返回<code>None</code>(或者至少不是原始对象),可以更快/更容易地发现错误;如果您尝试使用<code>newlist</code>,错误地认为它是<code>list</code>,您会立即得到<code>TypeError</code>或<code>AttributeError</code></p>
<p>基本上,提前知道的唯一方法就是阅读文档。对于名称指示修改操作的方法,您可以检查返回值,并经常了解它们是否在发生变化。首先,它有助于了解哪些类型是可变的;<code>list</code>、<code>dict</code>、<code>set</code>和<code>bytearray</code>都是可变的,并且它们不可变的对应项(除了没有不可变的对应项的<code>dict</code>)所缺少的方法往往会在适当的位置对对象进行变异。你知道吗</p>
<p>默认情况下,只需简单地对对象进行适当的修改就可以了,因为这样效率更高;如果有100000个元素<code>list</code>,那么<code>append</code>的默认行为会生成一个新的100001个元素<code>list</code>并返回它,这将是非常低效的(而且没有明显的方法可以避免它)。对于不可变的类型(例如<code>str</code>、<code>tuple</code>、<code>frozenset</code>),这是不可避免的,如果您希望保证对象永远不会原地突变,那么可以使用这些类型,但是这样做的代价是不必要地创建和销毁对象,这在大多数情况下会减慢代码的速度。你知道吗</p>