这个问题可能看起来很奇怪,但我仍然试图掌握虚拟机的概念.我已经阅读了几个答案,但是如果Java字节码(以及MSIL)与汇编语言相同,我仍然无法得到.据我所知,字节码和汇编都被编译成机器码,所以从抽象的角度讲,它们处于同一级别,即比机器码高出一步.字节码也只是汇编语言,即人类可读的机器代码形式.如果是,那么为什么仍然使用汇编语言?为什么不用字节码(可以在不同的机器上移植)而不是汇编语言(特定于单个机器架构)进行编程?谢谢
将整数值添加到浮点值时,我意识到__add__
如果在float上调用该方法工作正常,例如:
>>> n = 2.0
>>> m = 1
>>> n.__add__(m)
3.0
Run Code Online (Sandbox Code Playgroud)
但如果调用整数则不会:
>>> m.__add__(n)
NotImplemented
Run Code Online (Sandbox Code Playgroud)
起初我认为__add__
只是以不同的方式实现int
和float
类型(比如浮点类型接受添加到int类型,但不是相反).然后我注意到如果我使用+运算符,一切正常:
>>> n + m
3.0
>>> m + n
3.0
Run Code Online (Sandbox Code Playgroud)
有人知道为什么会这样吗?是__add__
和+
彼此没有很深的关系?
在Python中编码时,我经常使用插入return
循环来破坏函数/方法,例如当达到条件并且我想返回值时.我注意到如果我在Java中执行此操作,IDE(在本例中为Eclipse)似乎无法识别该return
命令.例如这里:
protected Node getTrueParent() {
for (Edge e : this.edges) {
if (e.getNode2() == this && (!e.isPseudo())) {
Node parent = e.getNode1();
return parent;
}
}
}
Run Code Online (Sandbox Code Playgroud)
Eclipse指出"此方法必须返回Node类型的结果".我在做什么不对?此外,parent
在for
循环内声明,所以我不能在循环之外返回它.一种方法是parent
在开头声明(即在循环之外),但这对我来说是非常草率的.写这个的正确方法是什么?
我遇到过这段代码:
counts = 128 * [0]
# some other steps here that modify the variable counts...
# in the end we have something like counts=[12, 583, 0, etc. , etc., 384]
for i in range(len(counts)):
if counts[i]:
outfile.write("%-12s%d\n" % (display(i), counts[i]))
Run Code Online (Sandbox Code Playgroud)
关于if
声明,我理解它的引入是为了在它何时跳过指令counts[i]==0
.那是因为0
相当于False
.但另一方面,我认为任何其他整数(除了1)都不等于True
.事实上,如果我3 == True
在shell上输入,我会得到False
答案.那么,有什么特别的理由if <some integer>
相当于if True
?
python ×2
add ×1
assembly ×1
bytecode ×1
cil ×1
if-statement ×1
integer ×1
java ×1
machine-code ×1