这个问题引起了有关perl中无限循环的问题:while(1)Vs。for(;;)是否存在速度差异?,我决定在python中运行类似的比较。我希望编译器会为while(True):pass
和生成相同的字节码while(1): pass
,但是python2.7实际上不是这种情况。
以下脚本:
import dis
def while_one():
while 1:
pass
def while_true():
while True:
pass
print("while 1")
print("----------------------------")
dis.dis(while_one)
print("while True")
print("----------------------------")
dis.dis(while_true)
产生以下结果:
while 1
----------------------------
4 0 SETUP_LOOP 3 (to 6)
5 >> 3 JUMP_ABSOLUTE 3
>> 6 LOAD_CONST 0 (None)
9 RETURN_VALUE
while True
----------------------------
8 0 SETUP_LOOP 12 (to 15)
>> 3 LOAD_GLOBAL 0 (True)
6 JUMP_IF_FALSE 4 (to 13)
9 POP_TOP
9 10 JUMP_ABSOLUTE 3
>> 13 POP_TOP
14 POP_BLOCK
>> 15 LOAD_CONST 0 (None)
18 RETURN_VALUE
使用while True
明显更复杂。为什么是这样?
在其他情况下,python的行为就好像True
等于1:
>>> True == 1
True
>>> True + True
2
为什么要while
区分两者?
我注意到python3确实使用相同的操作评估语句:
while 1
----------------------------
4 0 SETUP_LOOP 3 (to 6)
5 >> 3 JUMP_ABSOLUTE 3
>> 6 LOAD_CONST 0 (None)
9 RETURN_VALUE
while True
----------------------------
8 0 SETUP_LOOP 3 (to 6)
9 >> 3 JUMP_ABSOLUTE 3
>> 6 LOAD_CONST 0 (None)
9 RETURN_VALUE
python3中的布尔值评估方式是否有变化?
在Python
2.x中,True
它不是关键字,而只是在类型中定义为1的内置全局常量bool
。因此,解释器仍然必须加载的内容True
。换句话说,True
是可重新分配的:
Python 2.7 (r27:82508, Jul 3 2010, 21:12:11)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> True = 4
>>> True
4
在Python
3.x中,它确实成为关键字和实常数:
Python 3.1.2 (r312:79147, Jul 19 2010, 21:03:37)
[GCC 4.2.1 (Apple Inc. build 5664)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> True = 4
File "<stdin>", line 1
SyntaxError: assignment to keyword
因此,解释器可以将while True:
循环替换为无限循环。
本文向大家介绍do……while和while……do有什么区别?相关面试题,主要包含被问及do……while和while……do有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 前一个循环一遍再判断,后一个判断以后 再循环。
问题内容: 为什么Google会优先使用其(私有)JSON响应? 例如,这是在Google日历中打开和关闭日历时的响应: 我认为这是为了防止人们对此进行操作,但是您真正要做的就是替换,然后进行设置。我认为评估是为了确保人们编写安全的JSON解析代码。 我也曾在其他几个地方使用过此功能,但在Google(邮件,日历,通讯录等)中使用了更多功能。奇怪的是,GoogleDocs以开头,而Google C
问题内容: 我正在尝试构建hive-0.13。 使用时,它不会构建测试罐,但会检查测试依赖项。 使用时,它不会构建测试罐,也不会检查测试依赖项。 和之间有什么区别? 问题答案: Maven文档: 编译测试,但跳过运行它们 跳过编译测试 并且 不运行它们 同样这一点可能很重要 maven.test.skip被Surefire,Failsafe和编译器插件推崇
问题内容: 我的交互式控制台的简要记录: 到底为什么呢? 编辑: 为了对比起见,请考虑运算符。 这使得有很大的意义,因为虽然和都意味着同样的事,作为一个条件语句,他们真的是不一样的东西。 再次编辑: 更有趣的后果: 问题答案: 因为Python中的Boolean是整数的子类型。从文档中: 布尔值是两个常量对象False和True。它们用于表示真值(尽管其他值也可以视为假或真)。在数字上下文中(例如
问题内容: PS:我了解“真实”与真实之间的区别。 编辑:我也明白Boolean.TRUE是原始true的包装,然后我的问题是-为什么原始boolean接受Boolean.TRUE作为值?例如, 似乎是一个有效的声明。 问题答案: 原因 之所以 起作用 ,是因为 autounboxing 是Java 5的一项功能,该功能允许包装器对象在需要时自动转换为其等效的原始对象。相反, autoboxing
问题内容: 抱歉,我是Java新手,所以这个问题可能不清楚。 最近,我一直在尝试将try和catch语句包含在while循环中,因为我想确保从程序的其余部分中获取输入。 我遇到了一个问题,在while条件(例如,while(!done))中,在变量前面使用感叹号(!),而不是使用= false(例如,while(done = false))会更改程序的方式运行。 前者(!done)导致try和ex