如何访问函数的内部变量并在python中更改其值?

时间:2012-07-09 19:15:04

标签: python

>>> def nil():
...     ss='nil'
...     print ss
... 
>>> nil()
nil
>>> nil.ss='kk'
>>> nil()
nil
>>> print nil.ss
kk

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

6 个答案:

答案 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.ssss内的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中可能还有其他方法可以做到这一点,因为否则他们不会弃用模块。

一个人真的要问。你尝试用这种方法来解决这个奇怪的场景是什么?有可能无论你需要做什么,你都可以用更简单的方式做到这一点。通过函数的参数或您设计的类结构来满足您的需求。