了解Python是如何;编撰;或;解释为;函数对象
我读过以下文章,但我仍然不确定 如果我有一个Python文件myfunctions.py,其中包含以下代码了解Python是如何;编撰;或;解释为;函数对象,python,function,interpreter,Python,Function,Interpreter,我读过以下文章,但我仍然不确定 如果我有一个Python文件myfunctions.py,其中包含以下代码 x = 3 def f(): print x x = 2 然后,说$python myfunctions.py运行得非常好。 但是现在对上面的文件做一个小的更改。新文件的外观如下所示 x = 3 def f(): print x x = 2 f() # there is a function call now 这一次,代码给出了一个错误。现在,我
x = 3
def f():
print x
x = 2
然后,说$python myfunctions.py
运行得非常好。
但是现在对上面的文件做一个小的更改。新文件的外观如下所示
x = 3
def f():
print x
x = 2
f() # there is a function call now
这一次,代码给出了一个错误。现在,我试图理解这种行为。到目前为止,这些是我的结论
- Python为
x=3
- 它创建一个函数对象f,快速扫描并具有字节码,该字节码讨论f范围内的局部变量,但请注意,Python中所有语句的字节码都不太可能被构造
- 现在,Python遇到一个函数调用,它知道这个函数调用是合法的,因为存在关于函数对象f及其局部变量的最小字节码
- 现在,解释器负责执行字节码,但从最初的封装外形来看,它知道x是一个局部变量,并说:“为什么在分配之前要打印?”
有人能对此发表评论吗?提前谢谢。很抱歉,如果之前已经解决过这个问题。当解释器读取函数时,对于遇到的每个“名称”(变量),解释器将决定该名称是本地的还是非本地的。使用的标准非常简单。。。正文中是否有该名称的赋值语句(除非
global
语句)?e、 g:
如果该名称有赋值语句,则该名称被标记为“本地”,否则将被标记为非本地
现在,在您的例子中,您尝试打印一个标记为local的变量,但是您在实际到达临界赋值语句之前就这样做了。Python查找本地名称,但找不到,因此会引发UnboundLocalError
Python是非常动态的,它允许你做很多疯狂的事情,这也是它如此强大的原因之一。这样做的缺点是,除非实际运行函数,否则很难检查这些错误——事实上,python已经决定在函数运行之前不检查语法以外的任何内容。这就解释了为什么在实际调用函数之前从未看到异常
如果希望python将变量标记为全局变量,可以使用显式的
global
1语句:
x = 3
def foo():
global x
print x
x = 2
foo() # prints 3
print x # prints 2
1python3.x进一步引入了
非局部
关键字当解释器读取函数时,对于遇到的每个“名称”(变量),解释器决定该名称是局部的还是非局部的。使用的标准非常简单。。。正文中是否有该名称的赋值语句(除非global
语句)?e、 g:
如果该名称有赋值语句,则该名称被标记为“本地”,否则将被标记为非本地
现在,在您的例子中,您尝试打印一个标记为local的变量,但是您在实际到达临界赋值语句之前就这样做了。Python查找本地名称,但找不到,因此会引发UnboundLocalError
Python是非常动态的,它允许你做很多疯狂的事情,这也是它如此强大的原因之一。这样做的缺点是,除非实际运行函数,否则很难检查这些错误——事实上,python已经决定在函数运行之前不检查语法以外的任何内容。这就解释了为什么在实际调用函数之前从未看到异常
如果希望python将变量标记为全局变量,可以使用显式的
global
1语句:
x = 3
def foo():
global x
print x
x = 2
foo() # prints 3
print x # prints 2
1python3.x进一步引入了
非局部
关键字当解释器读取函数时,对于遇到的每个“名称”(变量),解释器决定该名称是局部的还是非局部的。使用的标准非常简单。。。正文中是否有该名称的赋值语句(除非global
语句)?e、 g:
如果该名称有赋值语句,则该名称被标记为“本地”,否则将被标记为非本地
现在,在您的例子中,您尝试打印一个标记为local的变量,但是您在实际到达临界赋值语句之前就这样做了。Python查找本地名称,但找不到,因此会引发UnboundLocalError
Python是非常动态的,它允许你做很多疯狂的事情,这也是它如此强大的原因之一。这样做的缺点是,除非实际运行函数,否则很难检查这些错误——事实上,python已经决定在函数运行之前不检查语法以外的任何内容。这就解释了为什么在实际调用函数之前从未看到异常
如果希望python将变量标记为全局变量,可以使用显式的
global
1语句:
x = 3
def foo():
global x
print x
x = 2
foo() # prints 3
print x # prints 2
1python3.x进一步引入了
非局部
关键字当解释器读取函数时,对于遇到的每个“名称”(变量),解释器决定该名称是局部的还是非局部的。使用的标准非常简单。。。正文中是否有该名称的赋值语句(除非global
语句)?e、 g:
如果该名称有赋值语句,则该名称被标记为“本地”,否则将被标记为非本地
现在,在您的例子中,您尝试打印一个标记为local的变量,但在您实际使用r之前就这样做了