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

我知道python中的一切都是一个对象,所以函数也是一个对象,现在我想更改存储在函数中的'ss'变量的值,现在我尝试使用nil.ss来更改它的值,但它没有; t改变..两个'ss'之间的区别是什么?

4

6 回答 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'
于 2012-07-09T19:17:09.190 回答
3

该函数是一个对象,但ss不是类中的成员变量。它是在函数体中定义的局部变量,外部不可访问。改变它的唯一明智的方法是改变函数的实现。

于 2012-07-09T19:18:02.377 回答
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'
于 2012-07-09T19:19:08.470 回答
1

ss您在函数体内创建的只是一个临时变量;在执行该行代码之前它不存在,并且一旦到达块的末尾它就不再存在。

您在函数上创建的ss是函数的属性。现在您有两个不同的变量命名ss,但它们彼此没有任何关系。

于 2012-07-09T19:22:30.613 回答
0

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

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

虽然我不建议使用它,因为它在 Python 3.0 中已被弃用。在 3.0 中可能还有其他方法可以做到这一点,因为否则他们不会弃用该模块。

真的要问了。您试图用您尝试编写的这种方法来解决什么奇怪的场景?很有可能,无论您需要做什么,您都可以用一种更简单的方式来完成它。通过函数的参数,或者您设计以满足您的需求的类结构。

于 2012-07-09T19:47:44.457 回答
0

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

于 2012-07-09T19:22:23.267 回答