ภายในขอบเขตของ Python การกำหนดตัวแปรใด ๆ ที่ยังไม่ได้ประกาศภายในขอบเขตนั้นจะสร้างตัวแปรท้องถิ่นใหม่ยกเว้นว่าจะมีการประกาศตัวแปรนั้นก่อนหน้านี้ในฟังก์ชั่นตามที่อ้างถึงตัวแปรที่กำหนดขอบเขตทั่วโลกด้วยคำglobal
สำคัญ
ลองดูที่ pseudocode ของคุณในเวอร์ชันดัดแปลงเพื่อดูว่าเกิดอะไรขึ้น:
# Here, we're creating a variable 'x', in the __main__ scope.
x = 'None!'
def func_A():
# The below declaration lets the function know that we
# mean the global 'x' when we refer to that variable, not
# any local one
global x
x = 'A'
return x
def func_B():
# Here, we are somewhat mislead. We're actually involving two different
# variables named 'x'. One is local to func_B, the other is global.
# By calling func_A(), we do two things: we're reassigning the value
# of the GLOBAL x as part of func_A, and then taking that same value
# since it's returned by func_A, and assigning it to a LOCAL variable
# named 'x'.
x = func_A() # look at this as: x_local = func_A()
# Here, we're assigning the value of 'B' to the LOCAL x.
x = 'B' # look at this as: x_local = 'B'
return x # look at this as: return x_local
ในความเป็นจริงคุณสามารถเขียนfunc_B
ตัวแปรทั้งหมดที่มีชื่อx_local
และมันจะทำงานเหมือนกัน
คำสั่งซื้อมีความสำคัญต่อลำดับการทำงานของคุณที่เปลี่ยนค่าของ Global x ดังนั้นในตัวอย่างของเราเพื่อไม่สำคัญตั้งแต่การโทรfunc_B
func_A
ในตัวอย่างนี้คำสั่งมีความสำคัญ:
def a():
global foo
foo = 'A'
def b():
global foo
foo = 'B'
b()
a()
print foo
# prints 'A' because a() was the last function to modify 'foo'.
โปรดทราบว่าglobal
จำเป็นต้องมีการแก้ไขวัตถุที่เป็นสากล global
คุณยังสามารถเข้าถึงได้จากภายในฟังก์ชั่นโดยไม่ต้องประกาศ ดังนั้นเรามี:
x = 5
def access_only():
return x
# This returns whatever the global value of 'x' is
def modify():
global x
x = 'modified'
return x
# This function makes the global 'x' equal to 'modified', and then returns that value
def create_locally():
x = 'local!'
return x
# This function creates a new local variable named 'x', and sets it as 'local',
# and returns that. The global 'x' is untouched.
สังเกตเห็นความแตกต่างระหว่างcreate_locally
และaccess_only
- access_only
กำลังเข้าถึง x ส่วนกลางแม้ว่าจะไม่ได้โทรglobal
ถึงแม้ว่าcreate_locally
จะไม่ได้ใช้global
ก็ตาม แต่ก็สร้างสำเนาภายในเครื่องเนื่องจากได้กำหนดค่า
ความสับสนที่นี่คือเหตุผลที่คุณไม่ควรใช้ตัวแปรทั่วโลก