范围是静态确定并动态使用的意思是什么?

时间:2016-09-30 23:58:35

标签: python class scope namespaces

这是我正在努力理解的课程的Python文档的摘录:

  

范围是Python程序的文本区域,可直接访问命名空间。这里的“可直接访问”意味着对名称的非限定引用会尝试在名称空间中查找名称。

     

虽然范围是静态确定的,但它们是动态使用的。

我并不完全理解作者对此定义中的作用域的含义,程序的文本区域是什么,以及作用域是静态确定和动态使用的含义。我对范围有直观的理解,但我很乐意完全理解文档的定义。如果有人愿意详细说明作者的想法,我将不胜感激。

1 个答案:

答案 0 :(得分:8)

“静态定义”

有全局范围和本地范围(让我们忽略第三个范围)。

在调用函数之前确定某个函数中的变量是全局函数还是局部函数,即静态

例如:

class ProductItem < ActiveRecord::Base
 belongs_to :product
 belongs_to :cart
 belongs_to :order


 def total_price_usd
    product.price_usd * quantity
 end

 def total_price_isl
    product.price_isl * quantity
 end

end

静态确定a = 1 b = 2 def func1(): c = 3 print func1.__code__.co_varnames # prints ('c',) 有一个局部变量,其名称为func1。静态地,因为它是在创建函数后立即完成的,而不是在实际访问某个局部变量时。

这有什么后果?好吧,例如,这个功能失败了:

c

如果范围在Python中是动态的,a = 1 def func2(): print a # raises an exception a = 2 将打印1.相反,与func2一致,已知print a是局部变量,因此全局{{} 1}}将不会被使用。本地a也不会被使用,因为它尚未初始化。

“动态使用”

来自same document

  

另一方面,名称的实际搜索是在运行时动态完成的 - 但是,语言定义在“编译”时朝着静态名称解析发展,所以不要依赖于动态名称解析! (事实上​​,局部变量已经静态确定。)

全局变量存储在字典中。访问全局变量a时,解释器会在该字典中查找键a。这是动态的用法。

不以这种方式使用局部变量。解释器事先知道函数有多少变量,因此它可以为每个变量提供一个固定的位置。然后,通过简单地使用“第二个局部变量”“第五个局部变量”来优化访问局部变量a,而无需实际使用变量名称