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