我一直在尝试使用sort函数对数组进行排序,但我忘了写括号。
arr.sort
而不是
arr.sort()
我的问题是为什么python不能检测到这个错误并告诉我像Java一样? 该程序保持编译正常,但由于我按升序输入数字,问题不会出现。
答案 0 :(得分:4)
arr.sort
在语法上有效。它只是你想要的语法。从语法上讲,arr.sort
是任何sort
求值的arr
属性的属性访问表达式;从语义上讲,当arr
是列表时,arr.sort
会计算arr
sort
方法的方法对象,因此它在运行时完全没问题太
它有点像Java中的method references,但由于Python是动态类型并且有方法对象,因此它不需要遍历所有功能接口和多表达式Java 8必须添加支持list::sort
语法。
语法错误仅适用于彻底无效的语法。
答案 1 :(得分: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()
进行尝试,那么它会调用该函数而不会实际按下按钮。
答案 2 :(得分:1)
Python无法检测到此类错误的原因是因为Python是动态类型的,而Java是静态类型的。
当您说a = arr.sort
时,python会将该函数分配给a
。现在你可以执行a()
,它将运行arr.sort。这在Python中是完全有效的,因为我们不提前告诉它a
应该是什么,它不能知道你是否认为a
是功能或排序列表...它只是相信你知道你正在做什么。
a
应该是什么。因此,当你意外地离开parens时,它会说&#34;这是一个功能,而不是像你说的那样的列表&#34;。
如果您使用像PyCharm这样的IDE,它会告诉您许多警告:
self.function
显示:
语句似乎没有效果,可以用函数调用替换为具有效果
但是我们分配它的那一刻:
a = self.function
它有效,无法检测到。