我不知道你可以这样做:
def tom():
print "tom's locals: ", locals()
def dick(z):
print "z.__name__ = ", z.__name__
z.guest = "Harry"
print "z.guest = ", z.guest
print "dick's locals: ", locals()
tom() #>>> tom's locals: {}
#print tom.guest #AttributeError: 'function' object has no attribute 'guest'
print "tom's dir:", dir(tom) # no 'guest' entry
dick( tom) #>>> z.__name__ = tom
#>>> z.guest = Harry
#>>> dick's locals: {'z': <function tom at 0x02819F30>}
tom() #>>> tom's locals: {}
#print dick.guest #AttributeError: 'function' object has no attribute 'guest'
print tom.guest #>>> Harry
print "tom's dir:", dir(tom) # 'guest' entry appears
函数 tom() 没有局部变量。函数 dick() 知道 tom() 住在哪里,并将 Harry 作为“客人”安置在 tom() 的地方。 harry 在 tom() 的地方不是本地人,但如果你问 tom 的客人,harry 会回答。 harry 是 tom() 的新属性。
更新:从 tom() 外部,您可以说“print dir(tom)”并查看 tom 对象的字典。 (您也可以从 inside tom() 执行此操作。这样 tom 可以发现他有一个新房客 harry,他的名字是“客人”。)
那么,属性可以从函数外部添加到函数的命名空间吗?经常这样做吗?这是可以接受的做法吗?在某些情况下是否推荐?它有时真的很重要吗? (它是 Pythonic 的吗?)
更新:标题现在说“属性”;它曾经说“变量”。这是一个 PEP about Function Attributes .
最佳答案
我认为您可能混淆了局部变量 和函数属性 的概念。有关 Python 函数属性的更多信息,请参阅 SO 问题 Python function attributes - uses and abuses .
关于Python函数可以从作用域外被赋予新的属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1753232/