我阅读了关于heisunbug的维基百科页面,但是不明白这个例子。任何人都可以详细解释一下吗?
“调试器通常还提供手表或其他用户界面,导致其他源代码(如属性访问器)被隐秘执行,这反过来又会改变程序的状态。”
答案 0 :(得分:2)
我认为它所得到的是调试器本身可以调用代码(例如getter)来检索您可能已经监视的属性的值。
考虑吸气剂:
def getter fahrenheit:
return celsius * 9 / 5 + 32;
如果你把手表放在fahrenheit
财产上会发生什么。
如果您的代码本身试图访问fahrenheit
属性,通常只会调用该代码,但是,如果调试器调用它来维护监视,则可能会在程序控制之外调用它。 / p>
一个简单的例子,假设getter有一个(非常明显的)bug,这意味着它在第一次被调用时返回错误的结果:
class temperature:
variable state
def init:
state = 1
def getter fahrenheit:
if state == 1:
state = 0
return -42
return celsius * 9 / 5 + 32;
因此,在没有调试器的情况下运行代码会出现问题,因为它会在您的代码第一次调用它时返回一个奇怪的值。
但是,如果您的调试器实际上正在调用getter来提取它正在观察的值(并且它可能在每次执行单步操作之后执行此操作),这意味着在代码调用它认为是第一次的时候,getter将很好地返回正确的值。
因此,当你试图仔细观察它时,问题就会消失,而这正是Heisenbug的定义,尽管海森堡的实际不确定性原理几乎没有与观察者效应有关。