7

メモを作成してノートブックに追加する以下のコードがあります。

私の質問は、グローバル変数に関連していますlast_id。クラス変数として宣言すると、つまりクラスノート内で宣言すると、次のエラーが発生しますが、クラス外で宣言すると、コードは正常に機能します。

ここに私の説明があります:

  1. クラス変数を受け入れないのはなぜですか。
  2. last_id関数内でグローバル変数として宣言するときに、なぜ defined が必要なのですか?

Error:

C:\Python27\Basics\OOP\formytesting>python notebook.py
Traceback (most recent call last):
  File "notebook.py", line 38, in <module>
    firstnote = Note('This is my first memo','example')
  File "notebook.py", line 10, in __init__
    last_id += 1
NameError: global name 'last_id' is not defined

code.py

import datetime
last_id = 0
class Note:

    def __init__(self, memo, tags):
        self.memo = memo
        self.tags = tags
        self.creation_date = datetime.date.today()
        global last_id
        last_id += 1
        self.id = last_id

        #global last_id
        #last_id += 1
        #self.id = last_id

    def __str__(self):
        return 'Memo={0}, Tag={1}, id={2}'.format(self.memo, self.tags,self.id)


class NoteBook:
    def __init__(self):
        self.notes = []

    def add_note(self,memo,tags):
        self.notes.append(Note(memo,tags))

    def __iter__(self):         
        for note in self.notes:             
            yield note 



if __name__ == "__main__":
    firstnote = Note('This is my first memo','example')
    print(firstnote)
    Notes = NoteBook()
    print("Adding a new note object")
    Notes.add_note('Added thru notes','example-1')
    Notes.add_note('Added thru notes','example-2')
    for note in Notes.notes:
        print(note.memo,note.tags)

    for note in Notes:
        print(note)

    print("Adding a new note object----End")    
4

4 に答える 4

10

あなたが書くとき

global last_id

関数内では、新しいグローバル変数を作成していません。あなたがしていることは、「新しいローカル変数を作成して名前last_idに関連付ける代わりに、その名前を、名前を持つ外側のスコープ内の既存の変数に関連付けるlast_id

という変数がまだない場合はlast_idglobal last_id書き込むまで何も参照しません。ただし、それに書き込むと、グローバル スコープで作成されます。例えば:

>>> def x():
...     global X
...     X = 1
... 
>>> x()
# No error
>>> X
1 # X is now defined
>>> def y():
...     global Y
...     print Y
... 
>>> y()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in y
NameError: global name 'Y' is not defined
于 2012-08-08T20:45:18.167 に答える
2

globalステートメントは名前をバインドしません。変数が発生したときにグローバルスコープで再バインドする必要があることをコンパイラに伝えるだけです。初期バインドは自分で行う必要があります。

于 2012-08-08T20:44:52.993 に答える