-2

我一直在尝试使用 sort 函数对数字数组进行排序,但我忘了写括号。

arr.sort

代替

arr.sort()

我的问题是为什么 python 不能检测到这个错误并像 Java 一样通知我?该程序一直编译良好,但因为我是按升序输入数字,所以问题不会出现。

4

3 回答 3

4

arr.sort在语法上是有效的。这不是您想要的语法。从句法上讲,arr.sort它是一个属性访问表达式,用于计算结果为的sort属性arr;从语义上讲,whenarr是一个列表,它arr.sort评估为arr'方法的方法对象sort,所以它在运行时也很好。

它有点像 Java 中的方法引用,但由于 Python 是动态类型的并且具有方法对象,因此它不需要遍历 Java 8 必须添加的所有函数式接口和 poly 表达式以支持list::sort语法。

语法错误仅适用于完全无效的语法。

于 2018-05-25T20:41:12.893 回答
2

因为这不是错误。

当你不包含()时,函数(或方法)不会被调用。相反,它返回函数。

例子:

>>> str.encode
<method 'encode' of 'str' objects>

在实际操作中:

import tkinter as tk

def hello():
    print('hello')

tk.Frame()
a = tk.button(text="Press", command=hello)
a.pack()
tk.mainloop()

现在,如果您尝试使用它,command=hello()那么它会在您实际按下按钮的情况下调用该功能。

于 2018-05-25T20:38:23.960 回答
1

Python 无法检测到此类错误的原因是因为 Python 是动态类型的,而 Java 是静态类型的。

当您说 时a = arr.sort,python 将函数分配给a. 现在你可以做a(),它会运行 arr.sort。这在 Python 中是完全有效的,因为我们没有提前告诉它a应该是什么,它无法知道你是a想成为一个函数还是一个排序列表……它只是相信你知道你在做什么。

另一方面,Java 是静态类型的:您提前告诉它a应该是什么。因此,当您不小心遗漏了括号时,它会说“这是一个函数,而不是您所说的列表”。


如果你使用像 PyCharm 这样的 IDE,它会告诉你很多警告:

self.function显示:

语句好像没有效果,可以换成函数调用有效果

但是我们分配它的那一刻:

a = self.function它有效果,无法检测到。

于 2018-05-25T20:45:03.127 回答