为什么用str.split(line)而不是line.split()更有意义?

2 投票
1 回答
854 浏览
提问于 2025-05-01 15:33

对于 str.split(line) 这个写法,我是在调用 str 类的一个方法,并把一个叫 line 的对象传给它,而这个 line 对象其实是一个装满字符串的列表,对吧?

我觉得直接在我的 line 对象上调用 split() 方法会更清楚一些。

我有点搞不懂为什么这两种写法都能用。

暂无标签

1 个回答

5

首先,你说得对,在这种情况下,直接使用 line.split()str.split(line) 更容易理解(而且更符合Python的风格等)。

但是,str.split 有用的情况吗?当然有。想象一下你有一堆行,你想把它们全部分开。下面哪个更容易理解:

split_lines = map(str.split, lines)
split_lines = map(lambda line: line.split(), lines)

因为 str.split 本身就是一个可以在任何 str 上使用的函数,所以你不需要创建一个新的函数来处理任何 str,这样就更方便了。


更一般来说,你问的是为什么Python有“未绑定的方法”。* 部分原因是这自然是Python方法设计的一部分。** 但主要是因为它们在传递给高阶函数时很方便(还有就是一切都应该可以作为值使用,除非有充分的理由不这样做)。


至于最后一部分,理解它们的工作原理可能有点复杂,不太适合在这里详细回答。你可以在这个教程中学习它们的基本工作原理;想了解更多细节,可以查看方法是如何工作的,里面还有其他有用的信息链接。不过,简单总结一下:

  • line.split 是一个绑定方法——它是一个可调用的对象,知道在你后续调用时要传递什么值作为 self 参数。所以,line.split() 只是调用这个绑定方法,没有额外的参数,而 line 会自动作为 self 传递。
  • str.split 是一个未绑定的方法——基本上就是一个函数。所以,str.split(line) 明确地将 line 作为 self 传递。

* 自从3.x版本以来,“未绑定的方法”这个术语就不太被强调了,因为实际上,未绑定的方法和函数是一样的。

** Guido 解释过几次这个问题;可以从他2009年的博客文章第一类的一切开始了解。

撰写回答