2012-07-09 97 views
3
>>> def nil(): 
...  ss='nil' 
...  print ss 
... 
>>> nil() 
nil 
>>> nil.ss='kk' 
>>> nil() 
nil 
>>> print nil.ss 
kk 

我知道一切都是python中的对象,所以函数也是一个对象,现在我想改变存储在函数中的'ss'变量的值,现在我试图通过使用nil来改变它的值。但它并没有改变......两个'ss'之间的差异是什么?如何访问函数的内部变量,并在python中更改其值?

回答

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' 
3

功能是一个对象,但ss是不是在这个意义上它是一个类的成员变量。它是在函数体中定义的局部变量,不能在外部访问。改变它的唯一理想的方法是改变函数的实现。

1
def nil(): 
ss='nil' 

这是因为nil.ss没有指向在nil函数定义的varible ss

nil.ss表示ss现在是nil对象的属性。

nil.ssss里面的nil()是完全不同的。

>>> def nil(): 
    ss='foo' 
    return ss 

>>> nil.ss='bar' 
>>> foo=nil() 
>>> bar=nil() 
>>> nil.ss 
'bar' 
>>> foo 
'foo' 
>>> bar 
'foo' 
0

要回答你的问题的另一部分:你不能在本地变量ss从函数外部改变。除非函数正在执行,否则它不存在。

1

你在函数体内创建的ss只是一个临时变量;直到该行代码被执行,它才存在,并且一旦到达块的末尾,它就不再存在。您在该函数上创建的ss是该函数的一个属性。现在你有两个不同的变量,名字叫ss,但他们完全没有关系。

0

您可以使用编译器模块修改代码。它将允许你以文本形式加载任意的python代码,将其解析为抽象语法树,对其进行修改,然后重新编译它。之后,您可以使用其他更改运行代码。

http://docs.python.org/library/compiler.html

虽然它在Python 3.0弃用我不会建议使用它。在3.0中可能有其他方式来做到这一点,因为否则它们不会弃用模块。我们真的不得不问,奇怪的是,你试图用你想写的这个方法来解决这个问题吗?无论你需要做什么,你都可以用更简单的方式来做到这一点。可以通过函数的参数或者您设计的适合您需要的类结构。

+0

这只是一个概念清除...与任何东西无关.. – 2012-07-09 19:50:06

相关问题