为什么我可以在python中编写一些乱序而不是其他的东西?

时间:2011-05-13 08:38:31

标签: python scope compilation closures declaration

请看下面的内容:

a = 5
print a + b
b = 4

当我尝试运行上面的代码时,它会出错: Traceback(最近一次调用最后一次):   文件“C:/Users/user/Documents/modules/ab.py”,第2行,in     打印a + b NameError:名称'b'未定义

确定。在a + b定义之前调用b。这意味着Python按顺序运行代码,从上到下开始。 但是,这个怎么样:

class Data:
    def __init__(self):
        self.debug_level = 9
        self.assign = [0, 0, 0, 0]
        self.days = 0
    def create_days(self, startTime, endTime):

        res = 0
        try:
          if self.final_days < self.maximum_days:

上面,self.final_daysself.maximum_days也没有定义,但它没有给出任何错误。它背后的逻辑是什么?

致以最诚挚的问候,

6 个答案:

答案 0 :(得分:5)

你还没有真正“运行”代码。在您的示例中,您拥有的只是Data类中的方法声明。在其中,Python不会检查类字段是否存在,因为它们可能在其他时间设置,在某些其他方法中(Python的类在这种意义上是可塑的)。

如果您尝试在Data类的新实例中运行create_days方法而不事先设置这些字段的值,则会出现错误。

答案 1 :(得分:4)

它不会产生任何错误,因为在定义类时不会访问属性。一旦拨打create_days(),您就会遇到问题:D

答案 2 :(得分:2)

只有在调用函数时,才会对函数体进行求值,而不是在定义它时。

答案 3 :(得分:1)

仅在运行代码时查找引用。您可以在create_days()方法中放置您喜欢的任何名称,并且在执行包含它们的行之前不会检查任何名称。

答案 4 :(得分:1)

如果你真的执行了它,你会得到的     AttributeError:数据实例没有属性'final_days'

重现这一点:

x = Data()
x.create_days(1,2)

另外,你有一个try块。我假设这是其他一些代码的摘录。 try块可能会吞噬异常。

答案 5 :(得分:0)

Python是一种解释型语言,与c ++不同,它不会被编译,因此在调用函数体之前不会对其进行求值。