บทนำสู่ตัวแปรระดับโลกและท้องถิ่นใน Python
เผยแพร่แล้ว: 2021-08-26Python จัดการกับตัวแปรในลักษณะที่ไม่ฝักใฝ่ฝ่ายใด ในขณะที่ภาษาโปรแกรมจำนวนมากพิจารณาตัวแปรเป็นสากลโดยดีฟอลต์ (เว้นแต่จะประกาศเป็นโลคัล) Python จะพิจารณาตัวแปรเป็นโลคัลเว้นแต่จะประกาศเป็นอย่างอื่น เหตุผลที่อยู่เบื้องหลัง Python ที่พิจารณาตัวแปรเป็นโลคัลโดยค่าเริ่มต้นคือการใช้ตัวแปรโกลบอลนั้นโดยทั่วไปถือเป็นแนวปฏิบัติในการเขียนโค้ดที่ไม่ดี
ดังนั้น ขณะเขียนโปรแกรมใน Python เมื่อการกำหนดตัวแปรเกิดขึ้นในฟังก์ชัน ตัวแปรเหล่านั้นจะอยู่ภายในเครื่องโดยค่าเริ่มต้น การปรับเปลี่ยนหรือการปรับแต่งใดๆ ที่คุณทำกับตัวแปรนี้ภายในเนื้อหาของฟังก์ชันจะอยู่ภายในขอบเขตของฟังก์ชันนี้เท่านั้น หรือกล่าวอีกนัยหนึ่ง การเปลี่ยนแปลงเหล่านั้นจะไม่สะท้อนให้เห็นในตัวแปรอื่นนอกฟังก์ชัน แม้ว่าตัวแปรจะมีชื่อเดียวกับตัวแปรของฟังก์ชันก็ตาม ตัวแปรทั้งหมดอยู่ในขอบเขตของฟังก์ชันที่กำหนดไว้และเก็บค่านั้นไว้ หากต้องการสัมผัสประสบการณ์จริงเกี่ยวกับตัวแปรและโครงการของหลาม ให้ลองใช้ใบรับรองวิทยาศาสตร์ข้อมูลของเราจากมหาวิทยาลัยที่ดีที่สุดจากสหรัฐอเมริกา
ในบทความนี้ เราจะมาสำรวจแนวคิดของตัวแปรท้องถิ่นและตัวแปรส่วนกลางใน Python ควบคู่ไปกับวิธีการกำหนดตัวแปรส่วนกลาง เราจะดูสิ่งที่เรียกว่า "ตัวแปรที่ไม่ใช่ในเครื่อง" ด้วย
อ่านต่อ!
สารบัญ
ตัวแปรโกลบอลและโลคัลใน Python
มาดูตัวอย่างเพื่อทำความเข้าใจว่าค่าส่วนกลางสามารถใช้ภายในเนื้อหาของฟังก์ชันใน Python ได้อย่างไร:
โปรแกรม:
def func():
พิมพ์ (สตริง)
string = "ฉันรัก Python!"
func()
เอาท์พุต
ฉันรักไพทอน!
อย่างที่คุณเห็น สตริงตัวแปรได้รับค่า "I love Python!" ก่อนเรียก func() เนื้อหาฟังก์ชันประกอบด้วยคำสั่งการพิมพ์เท่านั้น เนื่องจากไม่มีการมอบหมายตัวแปรสตริงภายในเนื้อหาของฟังก์ชัน จึงจะใช้ค่าของตัวแปรส่วนกลางแทน
ผลที่ได้คือผลลัพธ์จะเป็นอะไรก็ได้ตามค่าโกลบอลของสตริงตัวแปร ซึ่งในกรณีนี้คือ "I love Python!"
ตอนนี้ ให้เราเปลี่ยนค่าของสตริงภายใน func() และดูว่ามีผลกับตัวแปรส่วนกลางอย่างไร:
โปรแกรม:
def func():
string = "ฉันรัก Java!"
พิมพ์ (สตริง)
string = "ฉันรัก Python!"
func()
พิมพ์ (สตริง)
เอาท์พุท:
ฉันรักจาวา!
ฉันรักไพทอน!
ในโปรแกรมข้างต้น เราได้กำหนดฟังก์ชัน func() และภายในนั้น เรามีตัวแปรสตริงที่มีค่า “I love Java!” ดังนั้น ตัวแปรนี้เป็นโลคัลของฟังก์ชัน func() จากนั้น เรามีตัวแปรโกลบอลเหมือนก่อนหน้านี้ จากนั้นเราเรียกใช้ฟังก์ชันและคำสั่งการพิมพ์ ขั้นแรก ฟังก์ชันจะถูกทริกเกอร์ โดยเรียกใช้คำสั่งการพิมพ์ของฟังก์ชันนั้นและแสดงผลลัพธ์ "I love Java!" – ซึ่งเป็นตัวแปรโลคัลสำหรับฟังก์ชันนั้น จากนั้น เมื่อโปรแกรมอยู่นอกขอบเขตของฟังก์ชัน ค่าของ s จะถูกเปลี่ยนเป็น “I love Python” และนั่นคือสาเหตุที่เราได้รับทั้งสองบรรทัดเป็นเอาต์พุต
ตอนนี้ ให้เราเพิ่มสองตัวอย่างแรก และพยายามเข้าถึงสตริงโดยใช้คำสั่งพิมพ์ จากนั้นลองกำหนดค่าใหม่ให้กับสตริงนั้น โดยพื้นฐานแล้ว เรากำลังพยายามสร้างสตริงเป็นตัวแปรทั้งภายในเครื่องและทั่วโลก
โชคดีที่ Python ไม่อนุญาตให้เกิดความสับสนและเกิดข้อผิดพลาด โดยใช้วิธีดังนี้:
โปรแกรม:
def func():
พิมพ์ (สตริง)
string = "ฉันรัก Java!"
พิมพ์ (สตริง)
string = "ฉันรัก Python!"
func()
เอาต์พุต (ข้อผิดพลาด):
—————————————————————————
UnboundLocalError Traceback (การโทรล่าสุดล่าสุด)
<ipython-input-3-d7a23bc83c27> ใน <โมดูล>
5
6 string = “ฉันรัก Python!”
-> 7 func()
<ipython-input-3-d7a23bc83c27> ใน func()
1 def func():
—-> 2 พิมพ์ (สตริง)
3 string = “ฉันรัก Java!”
4 พิมพ์ (สตริง)
5
UnboundLocalError: ตัวแปรโลคัลถูกอ้างอิงก่อนกำหนด
เห็นได้ชัดว่า Python ไม่อนุญาตให้ตัวแปรเป็นทั้งโกลบอลและโลคัลภายในฟังก์ชัน ดังนั้นจึงให้ตัวแปรท้องถิ่นแก่เราเนื่องจากเรากำหนดค่าให้กับสตริงภายใน func() เป็นผลให้คำสั่งพิมพ์แรกแสดงการแจ้งเตือนข้อผิดพลาด ตัวแปรทั้งหมดที่สร้างหรือเปลี่ยนแปลงภายในขอบเขตของฟังก์ชันใดๆ จะเป็นแบบโลคัล เว้นแต่จะได้รับการประกาศเป็น "สากล" อย่างชัดเจน
การกำหนดตัวแปรส่วนกลางใน Python
จำเป็นต้องใช้คำหลักสากลเพื่อแจ้ง Python ว่าเรากำลังเข้าถึงตัวแปรส่วนกลาง โดยใช้วิธีดังนี้:
โปรแกรม:
def func():
สตริงสากล
พิมพ์ (สตริง)
string = “แต่ฉันก็อยากเรียน Python เหมือนกัน!”
พิมพ์ (สตริง)
string = "ฉันกำลังมองหาที่จะเรียนรู้ Java!"
func()
พิมพ์ (สตริง)
เอาท์พุท:
ฉันกำลังมองหาที่จะเรียนรู้ Java!
แต่ฉันก็อยากเรียน Python เหมือนกัน!
แต่ฉันก็อยากเรียน Python เหมือนกัน!
ดังที่คุณเห็นจากผลลัพธ์ Python รู้จักตัวแปรส่วนกลางที่นี่ และประเมินคำสั่งการพิมพ์ตามนั้น โดยให้ผลลัพธ์ที่เหมาะสม
การใช้ตัวแปรร่วมในฟังก์ชันที่ซ้อนกัน
ตอนนี้ ให้เราตรวจสอบว่าจะเกิดอะไรขึ้นหากตัวแปรส่วนกลางถูกใช้ในฟังก์ชันที่ซ้อนกัน ลองดูตัวอย่างนี้ซึ่งมีการกำหนดและใช้งานตัวแปร 'ภาษา' ในขอบเขตต่างๆ:
โปรแกรม:
def func():
ภาษา = "ภาษาอังกฤษ"
def func1():
ภาษาสากล
ภาษา = “สเปน”
พิมพ์(“ก่อนโทร func1: ” + ภาษา)
พิมพ์("กำลังโทร func1 ทันที:")
func1()
พิมพ์(“หลังจากโทร func1: ” + ภาษา)
func()
พิมพ์("คุณค่าของภาษาหลัก: " + ภาษา)
เอาท์พุท:
ก่อนโทร func1: English
กำลังโทร func1 ตอนนี้:
หลังจากโทร func1: อังกฤษ
ค่าของภาษาหลัก: สเปน
อย่างที่คุณเห็น คีย์เวิร์ดสากล เมื่อใช้ภายใน func1 ที่ซ้อนกัน จะไม่มีผลกระทบต่อ 'ภาษา' ของตัวแปรของฟังก์ชันพาเรนต์ นั่นคือค่าจะถูกเก็บไว้เป็น "ภาษาอังกฤษ" นอกจากนี้ยังแสดงให้เห็นว่าหลังจากเรียก func() ตัวแปร 'ภาษา' มีอยู่ในโมดูลเนมสเปซที่มีค่า 'สเปน'
การค้นพบนี้สอดคล้องกับสิ่งที่เราค้นพบในส่วนก่อนหน้านี้เช่นกัน - เมื่อกำหนดตัวแปรภายในเนื้อหาของฟังก์ชัน จะอยู่ในตำแหน่งเสมอ เว้นแต่จะระบุไว้เป็นอย่างอื่น อย่างไรก็ตาม ควรมีกลไกในการเข้าถึงตัวแปรที่อยู่ในขอบเขตอื่นๆ ด้วยเช่นกัน
นั่นคือที่มาของตัวแปร nonlocal!
ตัวแปรที่ไม่ใช่ท้องถิ่น
ตัวแปร nonlocal เป็นตัวแปรชนิดใหม่ที่นำเสนอโดย Python3 สิ่งเหล่านี้มีความเหมือนกันมากกับตัวแปรส่วนกลางและมีความสำคัญอย่างยิ่งเช่นกัน อย่างไรก็ตาม ความแตกต่างอย่างหนึ่งระหว่างตัวแปร nonlocal และ global คือตัวแปร nonlocal ไม่สามารถเปลี่ยนตัวแปรจากขอบเขตของโมดูลได้
ดูตัวอย่างต่อไปนี้เพื่อทำความเข้าใจสิ่งนี้:
โปรแกรม:
def func():
ภาษาสากล
พิมพ์ (ภาษา)
ภาษา = “ภาษาเยอรมัน”
func()
เอาท์พุท:
เยอรมัน
ตามที่คาดไว้ โปรแกรมส่งคืน 'Frankfurt' เป็นผลลัพธ์ ตอนนี้ ให้เราเปลี่ยน 'ทั่วโลก' เป็น 'ไม่ใช่ในเครื่อง' และดูว่าเกิดอะไรขึ้น:
โปรแกรม:
def func():
ภาษาต่างประเทศ
พิมพ์ (ภาษา)
ภาษา = “ภาษาเยอรมัน”
func()
เอาท์พุท:
ไฟล์ “<ipython-input-9-97bb311dfb80>” บรรทัดที่ 2
ภาษาต่างประเทศ
^
SyntaxError: ไม่พบการผูกมัดสำหรับ 'ภาษา' ที่ไม่ใช่โลคัล
อย่างที่คุณเห็น โปรแกรมด้านบนแสดงข้อผิดพลาดทางไวยากรณ์ เราสามารถเข้าใจได้จากที่นี่ว่าการมอบหมายที่ไม่ใช่ในพื้นที่สามารถทำได้จากคำจำกัดความของฟังก์ชันที่ซ้อนกันเท่านั้น ตัวแปรที่ไม่ใช่โลคัลควรกำหนดไว้ภายในขอบเขตของฟังก์ชัน และหากไม่เป็นเช่นนั้น ก็จะไม่พบคำจำกัดความในขอบเขตที่ซ้อนอยู่เช่นกัน ตอนนี้ ตรวจสอบโปรแกรมต่อไปนี้:
โปรแกรม:
def func():
ภาษา = "ภาษาอังกฤษ"
def func1():
ภาษาต่างประเทศ
ภาษา = “ภาษาเยอรมัน”
พิมพ์(“ก่อนโทร func1: ” + ภาษา)
พิมพ์("กำลังโทร func1 ทันที:")
func1()
พิมพ์(“หลังจากโทร func1: ” + ภาษา)
ภาษา = “สเปน”
func()
พิมพ์("'ภาษา' ในหลัก: ” + ภาษา)
เอาท์พุท:
ก่อนโทร func1: English
กำลังโทร func1 ตอนนี้:
หลังจากโทร func1: เยอรมัน
'ภาษา' ในหลัก: ภาษาสเปน
โปรแกรมข้างต้นใช้งานได้เนื่องจากตัวแปร 'ภาษา' ถูกกำหนดไว้ก่อนเรียก func1() หากไม่ได้กำหนดไว้ เราจะได้รับข้อผิดพลาดดังต่อไปนี้:
โปรแกรม:
def func():
#language = “อังกฤษ”
def func1():
ภาษาต่างประเทศ
ภาษา = “ภาษาเยอรมัน”
พิมพ์(“ก่อนโทร func1: ” + ภาษา)
พิมพ์("กำลังโทร func1 ทันที:")
func1()
พิมพ์(“หลังจากโทร func1: ” + ภาษา)
ภาษา = “สเปน”
func()
พิมพ์("'ภาษา' ในหลัก: ” + ภาษา)
เอาท์พุท:
ไฟล์ “<ipython-input-11-5417be93b6a6>” บรรทัดที่ 4
ภาษาต่างประเทศ
^
SyntaxError: ไม่พบการผูกมัดสำหรับ 'ภาษา' ที่ไม่ใช่โลคัล
อย่างไรก็ตาม โปรแกรมจะทำงานได้ดีถ้าเราแทนที่ nonlocal ด้วย global:
โปรแกรม:
def func():
#language = “อังกฤษ”
def func1():
ภาษาสากล
ภาษา = “ภาษาเยอรมัน”
พิมพ์(“ก่อนเรียก func1`: ” + ภาษา)
พิมพ์("กำลังโทร func1 ทันที:")
func1()
พิมพ์(“หลังจากโทร func1: ” + ภาษา)
ภาษา = “สเปน”
func()
พิมพ์("'ภาษา' ในหลัก: ” + ภาษา)
เอาท์พุท:
ก่อนโทร func1: English
กำลังโทร func1 ตอนนี้:
หลังจากโทร func1: เยอรมัน
'ภาษา' ในหลัก: ภาษาเยอรมัน
หากคุณสังเกตเห็น ค่าของตัวแปรส่วนกลาง (ภาษา) ก็เปลี่ยนไปในโปรแกรมด้านบนเช่นกัน! นั่นคือพลังที่ตัวแปร nonlocal นำมาด้วย!
สรุปแล้ว
ในบทความนี้ เราได้พูดถึงตัวแปรโลคัล โกลบอล และตัวแปรที่ไม่ใช่โลคัลใน Python พร้อมกับกรณีการใช้งานต่างๆ และข้อผิดพลาดที่เป็นไปได้ที่คุณควรระวัง ด้วยความรู้นี้ที่อยู่เคียงข้างคุณ คุณจะเริ่มฝึกฝนกับตัวแปรประเภทต่างๆ และสังเกตความแตกต่างเล็กน้อยได้
Python เป็นภาษาการเขียนโปรแกรมที่ได้รับความนิยมอย่างมากทั่วโลก โดยเฉพาะอย่างยิ่งเมื่อต้องแก้ไขปัญหาและความท้าทายที่เกี่ยวข้องกับข้อมูล ที่ upGrad เรามีฐานผู้เรียนในกว่า 85 ประเทศ โดยมีผู้เรียนที่ชำระเงินแล้วกว่า 40,000 คนทั่วโลก และโปรแกรมของเราส่งผลกระทบต่อคนทำงานมากกว่า 500,000 คน หลักสูตร Data Science และ Machine Learning ของ เราได้รับการออกแบบมาเพื่อช่วยให้นักเรียนมีแรงบันดาลใจจากภูมิหลังใดๆ ก็ตามในการเริ่มต้นการเดินทางและมีความโดดเด่นในด้านวิทยาศาสตร์ข้อมูล ความช่วยเหลือด้านอาชีพแบบ 360 องศาของเราช่วยให้มั่นใจได้ว่าเมื่อคุณลงทะเบียนกับเราแล้ว อาชีพของคุณจะก้าวไปสู่ระดับที่สูงขึ้นเท่านั้น ติดต่อเราวันนี้และสัมผัสพลังของการเรียนรู้จากเพื่อนและเครือข่ายทั่วโลก!
ตามขอบเขตของตัวแปร ตัวแปรใน Python จะเป็นแบบโลคัล โกลบอล หรือไม่โลคัล ใช่ ตัวแปรส่วนกลางสามารถเข้าถึงได้จากภายในฟังก์ชันใน Python ตัวแปรโกลบอลมีขอบเขตของโปรแกรมทั้งหมด ในขณะที่ตัวแปรโลคัลมีเฉพาะฟังก์ชันที่กำหนดให้เป็นขอบเขตเท่านั้นตัวแปรประเภทใดบ้างใน Python
ตัวแปรส่วนกลางใน Python สามารถเข้าถึงได้จากภายในฟังก์ชันหรือไม่?
อะไรคือความแตกต่างระหว่างตัวแปรท้องถิ่นและตัวแปรระดับโลก?