>>> def nil():
... ss='nil'
... print ss
...
>>> nil()
nil
>>> nil.ss='kk'
>>> nil()
nil
>>> print nil.ss
kk
我知道在Python中一切都是对象,所以函数也是一个对象。现在我想改变存储在函数中的“ss”变量的值,但我尝试使用“nil.ss”更改其值,但它并没有改变。这两个“ss”有什么区别?
>>> def nil():
... ss='nil'
... print ss
...
>>> nil()
nil
>>> nil.ss='kk'
>>> nil()
nil
>>> print nil.ss
kk
我知道在Python中一切都是对象,所以函数也是一个对象。现在我想改变存储在函数中的“ss”变量的值,但我尝试使用“nil.ss”更改其值,但它并没有改变。这两个“ss”有什么区别?
第一个ss
是函数的内部变量;第二个是函数的属性。它们不引用同一对象。
以下是一种实现方式:
>>> def apple():
if not hasattr(apple, 'ss'): # This way it'll only be set inside the function once
apple.ss = 'nil'
return apple.ss
>>> apple()
'nil'
>>> apple.ss
'nil'
>>> apple.ss = 'kk'
>>> apple.ss
'kk'
>>> apple()
'kk'
该函数是一个对象,但ss
不是类中的成员变量。它是在函数体中定义的局部变量,无法从外部访问。唯一合理的方法是改变该函数的实现来改变ss
的值。
ss
只是一个临时变量;它在代码执行到那一行时才存在,并且在块的末尾到达后就不存在了。ss
是函数的属性。现在你有两个名为ss
的不同变量,但它们完全没有任何关系。def nil():
ss='nil'
这是因为nil.ss
并不指向在nil
函数中定义的变量ss
。
nil.ss
表示ss
现在是nil
对象的属性。
nil.ss
和nil()
内部的ss
是完全不同的。
>>> def nil():
ss='foo'
return ss
>>> nil.ss='bar'
>>> foo=nil()
>>> bar=nil()
>>> nil.ss
'bar'
>>> foo
'foo'
>>> bar
'foo'
ss
。它只存在于函数执行时。http://docs.python.org/library/compiler.html
虽然我不建议在Python 3.0中使用它,因为它已经被弃用了。如果没有其他方法来完成这个模块,他们就不会将其弃用。
真的需要问一下,你正在尝试解决什么奇怪的场景,需要使用这种方法来编写代码?很有可能,无论你需要做什么,都可以通过函数参数或设计符合你需求的类结构来更简单地实现。