บทนำสู่ตัวแปรระดับโลกและท้องถิ่นใน Python

เผยแพร่แล้ว: 2021-08-26

Python จัดการกับตัวแปรในลักษณะที่ไม่ฝักใฝ่ฝ่ายใด ในขณะที่ภาษาโปรแกรมจำนวนมากพิจารณาตัวแปรเป็นสากลโดยดีฟอลต์ (เว้นแต่จะประกาศเป็นโลคัล) 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

อะไรคือความแตกต่างระหว่างตัวแปรท้องถิ่นและตัวแปรระดับโลก?

ตัวแปรโกลบอลมีขอบเขตของโปรแกรมทั้งหมด ในขณะที่ตัวแปรโลคัลมีเฉพาะฟังก์ชันที่กำหนดให้เป็นขอบเขตเท่านั้น