[英]Python variable scope issue
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
的值? 我知道這是一個可變范圍的問題,但我想知道一些細節。
功能分配在功能本地范圍內分配。 setName
在setName
的本地范圍內分配_name
,外部_name
不受影響。
在Python 2.X中,可以使用global語句分配給模塊全局范圍,而不是外部局部范圍。
Python 3.X添加了nonlocal
語句(如果您有興趣,請參閱PEP-3104了解詳細信息)。 在您的示例中,可以在setName中使用nonlocal來分配給外部本地范圍。
這篇博客文章討論了Python中的變量作用域,並提供了一些不錯的示例和變通方法(具體請參見示例5)。
在這種情況下, _name
是setName()
函數的局部變量,因為每個變量名都是在函數中分配的。
除非您有global
語句或在3.x中使用nonlocal
語句,否則在這種情況下會有所幫助。
為什么不將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')
如果非絕對必要,則應避免使用全局變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.