这是我正在努力理解的课程的Python文档的摘录:
范围是Python程序的文本区域,可直接访问命名空间。这里的“可直接访问”意味着对名称的非限定引用会尝试在名称空间中查找名称。
虽然范围是静态确定的,但它们是动态使用的。
我并不完全理解作者对此定义中的作用域的含义,程序的文本区域是什么,以及作用域是静态确定和动态使用的含义。我对范围有直观的理解,但我很乐意完全理解文档的定义。如果有人愿意详细说明作者的想法,我将不胜感激。
答案 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
也不会被使用,因为它尚未初始化。
另一方面,名称的实际搜索是在运行时动态完成的 - 但是,语言定义在“编译”时朝着静态名称解析发展,所以不要依赖于动态名称解析! (事实上,局部变量已经静态确定。)
全局变量存储在字典中。访问全局变量a
时,解释器会在该字典中查找键a
。这是动态的用法。
不以这种方式使用局部变量。解释器事先知道函数有多少变量,因此它可以为每个变量提供一个固定的位置。然后,通过简单地使用“第二个局部变量”或“第五个局部变量”来优化访问局部变量a
,而无需实际使用变量名称