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

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

我知道在Python中一切都是对象,所以函数也是一个对象。现在我想改变存储在函数中的“ss”变量的值,但我尝试使用“nil.ss”更改其值,但它并没有改变。这两个“ss”有什么区别?

6个回答

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不是类中的成员变量。它是在函数体中定义的局部变量,无法从外部访问。唯一合理的方法是改变该函数的实现来改变ss的值。


1
在函数体内创建的ss只是一个临时变量;它在代码执行到那一行时才存在,并且在块的末尾到达后就不存在了。
在函数上创建的ss是函数的属性。现在你有两个名为ss的不同变量,但它们完全没有任何关系。

1
def nil():
 ss='nil'

这是因为nil.ss并不指向在nil函数中定义的变量ss

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

nil.ssnil()内部的ss是完全不同的。

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

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

0
回答你问题的另一部分:你不能从函数外部改变局部变量 ss。它只存在于函数执行时。

0
你可以使用编译器模块修改代码。它允许你将任意的Python代码作为文本加载,将其解析成抽象语法树,进行修改,然后重新编译。之后,你就可以运行带有额外更改的代码了。

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

虽然我不建议在Python 3.0中使用它,因为它已经被弃用了。如果没有其他方法来完成这个模块,他们就不会将其弃用。

真的需要问一下,你正在尝试解决什么奇怪的场景,需要使用这种方法来编写代码?很有可能,无论你需要做什么,都可以通过函数参数或设计符合你需求的类结构来更简单地实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接