簡體   English   中英

Python變量范圍問題

[英]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的值? 我知道這是一個可變范圍的問題,但我想知道一些細節。

功能分配在功能本地范圍內分配。 setNamesetName的本地范圍內分配_name ,外部_name不受影響。

在Python 2.X中,可以使用global語句分配給模塊全局范圍,而不是外部局部范圍。

Python 3.X添加了nonlocal語句(如果您有興趣,請參閱PEP-3104了解詳細信息)。 在您的示例中,可以在setName中使用nonlocal來分配給外部本地范圍。

這篇博客文章討論了Python中的變量作用域,並提供了一些不錯的示例和變通方法(具體請參見示例5)。

在這種情況下, _namesetName()函數的局部變量,因為每個變量名都是在函數中分配的。

除非您有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM