我一直在尝试使用 sort 函数对数字数组进行排序,但我忘了写括号。
arr.sort
代替
arr.sort()
我的问题是为什么 python 不能检测到这个错误并像 Java 一样通知我?该程序一直编译良好,但因为我是按升序输入数字,所以问题不会出现。
我一直在尝试使用 sort 函数对数字数组进行排序,但我忘了写括号。
arr.sort
代替
arr.sort()
我的问题是为什么 python 不能检测到这个错误并像 Java 一样通知我?该程序一直编译良好,但因为我是按升序输入数字,所以问题不会出现。
arr.sort
在语法上是有效的。这不是您想要的语法。从句法上讲,arr.sort
它是一个属性访问表达式,用于计算结果为的sort
属性arr
;从语义上讲,whenarr
是一个列表,它arr.sort
评估为arr
'方法的方法对象sort
,所以它在运行时也很好。
它有点像 Java 中的方法引用,但由于 Python 是动态类型的并且具有方法对象,因此它不需要遍历 Java 8 必须添加的所有函数式接口和 poly 表达式以支持list::sort
语法。
语法错误仅适用于完全无效的语法。
因为这不是错误。
当你不包含()
时,函数(或方法)不会被调用。相反,它返回函数。
例子:
>>> 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()
那么它会在您实际按下按钮的情况下调用该功能。
Python 无法检测到此类错误的原因是因为 Python 是动态类型的,而 Java 是静态类型的。
当您说 时a = arr.sort
,python 将函数分配给a
. 现在你可以做a()
,它会运行 arr.sort。这在 Python 中是完全有效的,因为我们没有提前告诉它a
应该是什么,它无法知道你是a
想成为一个函数还是一个排序列表……它只是相信你知道你在做什么。
另一方面,Java 是静态类型的:您提前告诉它a
应该是什么。因此,当您不小心遗漏了括号时,它会说“这是一个函数,而不是您所说的列表”。
如果你使用像 PyCharm 这样的 IDE,它会告诉你很多警告:
self.function
显示:
语句好像没有效果,可以换成函数调用有效果
但是我们分配它的那一刻:
a = self.function
它有效果,无法检测到。