Python脚本:
def show(name):
def getName():
return _name
def setName(value):
_name = value
_name = ''
print('Input parameter: ', name)
print('Global variable: ', say_hello)
print('Change private variable: ', setName(name))
print('Get private variable: ', getName())
print('Private variable: ', _name)
print('Input parameter: ', name)
say_hello = 'hello'
show('Jim')
输出:
Input parameter: Jim
Global variable: hello Change
private variable: None
Get private variable:
Private variable:
Input parameter: Jim
为什么内部函数不会更改_name
的值,但函数show
可以获得say_hello
的值?我知道这是一个可变范围问题,但我想知道一些细节。
答案 0 :(得分:1)
函数中的赋值在函数局部范围中指定。 setName
在_name
的本地范围内指定setName
,外部_name
不受影响。
在Python 2.X中,可以使用全局语句分配给模块全局范围,但不能分配给外部本地范围。
Python 3.X添加了nonlocal
语句(如果您有兴趣,请参阅PEP-3104了解详细信息)。在您的示例中,可以在setName中使用nonlocal来分配外部本地范围。
This blog post讨论了Python中的变量作用域,并提供了一些很好的示例和解决方法(具体见示例5)。
答案 1 :(得分:0)
_name
是setName()
函数的本地函数,因为每个变量名都是在函数中赋值的。
除非您有global
语句或3.x,nonlocal
语句,否则在这种情况下会对您有帮助。
答案 2 :(得分:0)
为什么不将show
作为say_hello
方法移动?
class SayHello(unicode):
_name = u""
def get_name(self):
return self._name
def set_name(self, value):
self._name = value
def show(self, name):
self.name = name
print(self, self.name)
name = property(get_name, set_name)
say_hello = SayHello('hello')
say_hello.show('Jim')
如果不是绝对必要,你应该避免使用全局变量。