>>> def nil():
... ss='nil'
... print ss
...
>>> nil()
nil
>>> nil.ss='kk'
>>> nil()
nil
>>> print nil.ss
kk
我知道python中的一切都是一个对象,所以函数也是一个对象,现在我想更改存储在函数中的'ss'变量的值,现在我尝试使用nil.ss来更改它的值,但它没有; t改变..两个'ss'之间的区别是什么?
>>> def nil():
... ss='nil'
... print ss
...
>>> nil()
nil
>>> nil.ss='kk'
>>> nil()
nil
>>> print nil.ss
kk
我知道python中的一切都是一个对象,所以函数也是一个对象,现在我想更改存储在函数中的'ss'变量的值,现在我尝试使用nil.ss来更改它的值,但它没有; t改变..两个'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
不是类中的成员变量。它是在函数体中定义的局部变量,外部不可访问。改变它的唯一明智的方法是改变函数的实现。
def nil():
ss='nil'
这是因为nil.ss
不指向函数ss
中定义的变量nil
。
nil.ss
手段ss
现在是nil
对象的一个属性。
nil.ss
和ss
里面nil()
完全不同。
>>> def nil():
ss='foo'
return ss
>>> nil.ss='bar'
>>> foo=nil()
>>> bar=nil()
>>> nil.ss
'bar'
>>> foo
'foo'
>>> bar
'foo'
ss
您在函数体内创建的只是一个临时变量;在执行该行代码之前它不存在,并且一旦到达块的末尾它就不再存在。
您在函数上创建的ss
是函数的属性。现在您有两个不同的变量命名ss
,但它们彼此没有任何关系。
您可以使用编译器模块修改代码。它将允许您将任意 python 代码作为文本加载,将其解析为抽象语法树,对其进行更改,然后重新编译。之后,您可以运行带有其他更改的代码。
http://docs.python.org/library/compiler.html
虽然我不建议使用它,因为它在 Python 3.0 中已被弃用。在 3.0 中可能还有其他方法可以做到这一点,因为否则他们不会弃用该模块。
真的要问了。您试图用您尝试编写的这种方法来解决什么奇怪的场景?很有可能,无论您需要做什么,您都可以用一种更简单的方式来完成它。通过函数的参数,或者您设计以满足您的需求的类结构。
要回答您问题的另一部分:您不能ss
从函数外部更改局部变量。除非函数正在执行,否则它不存在。