variable scope គឺជាទីកន្លែងផ្សេងៗនៅក្នុងសតិរបស់កំព្យូទ័រ ដែលមានព្រុំដែនច្បាស់លាស់។
ដែលហៅថា global scope គឺជាទីកន្លែងនៅខាងក្រៅ function ។ ដើម្បីបង្កើតវត្ថុផ្សេងៗនៅក្នុង global scope យើងត្រូវធ្វើដូចខាងក្រោមនេះ៖
money_list = [2000, 1500] def get_profit(sale=0, buy=0): profit = sale - buy print('The profit is', profit) get_profit(*money_list)
The profit is 500
ដែលហៅថា local scope គឺជាទីន្លែងនៅក្នុង function ។ ដើម្បីបង្កើតវត្ថុផ្សេងៗនៅក្នុង local scope យើងត្រូវធ្វើដូចខាងក្រោមនេះ៖
def get_profit(sale=0, buy=0): money_list = [2000, 1500] sale = money_list[0] buy = money_list[1] profit = sale - buy print('The profit is', profit) get_profit()
The profit is 500
គ្រប់វត្ថុនៅក្នុង local scope ត្រូវបង្កើតឡើងនៅពេល function ត្រូវបាន call និងត្រូវលុបចោលទៅវិញ នៅពេលដែល function ត្រូវបានប្រើរួចហើយ។ ជាក់ស្តែង នៅក្នុងកម្មវិធីខាងលើនេះ variable ឈ្មោះ money_list ត្រូវបានបង្កើតឡើងនៅក្នុង local scope នៅពេលដែល function ឈ្មោះ get_profit() ត្រូវបាន call តែ variable នេះត្រូវបានលុបចោលទៅវិញ នៅពេលដែល block នៃ statement នៅក្នុង function នោះត្រូវបានអនុវត្តចប់សព្វគ្រប់។
មួយវិញទៀត នៅពេលដែល function មួយត្រូវបានបង្កើតឡើងនៅក្នុង function មួយទៀត ទីកន្លែងរបស់ function នៅខាងក្នុងត្រូវហៅថា nested scope និងទីកន្លែងរបស់ function នៅខាងក្រៅត្រូវហៅថា enclosing scope ។ ដើម្បីបង្កើតវត្ថុផ្សេងៗនៅក្នុង nested scope និង enclosing scope យើងត្រូវធ្វើដូចខាងក្រោមនេះ៖
def enclose_func(): money_list = [2000, 1500] print('The object created in enclosing scope is', money_list) def nested_func(): money_dict = {'sale': 2000, 'buy': 1500} print('The object created in nested scope is', money_dict) nested_func() enclose_func()
The object created in enclosing scope is [2000, 1500] The object created in nested scope is {'sale': 2000, 'buy': 1500}
វត្ថុនៅក្នុង nested scope និងវត្ថុនៅក្នុង enclosing scope ក៏ដូចជាវត្ថុនៅក្នុង local scope ដែរ គឺវាត្រូវបានបង្កើតឡើងនៅពេលដែល function ត្រូវបាន call និងត្រូវលុបចោលវិញ នៅពេលដែល function ត្រូវបាន call រួចហើយ។ ក៏ប៉ុន្តែ បើសិនជាវត្ថុទាំងនោះត្រូវបានបញ្ជូនចេញទៅកាន់ global scope វត្ថុទាំងនោះនឹងមិនត្រូវបានលុបចោលឡើយ នៅពេលដែល function ត្រូវបាន call រួចហើយនោះ។ ពិនិត្យកម្មវិធីខាងក្រោមនេះ៖
def get_profit(): sale = 1000 buy = 900 profit = sale - buy return profit money = get_profit() print(money)
100
ដែលហៅថា built-in scope គឹជាទីកន្លែងមួយនៅក្នុងសតិរបស់កំព្យូទ័រ ដែលវត្ថុមួយចំនួនត្រូវបានបង្កើតឡើងរួចជាស្រេចទុកនៅក្នុងនោះ។ វត្ថុទាំងនោះត្រូវហៅថា built-in object ដែលអាចត្រូវយកទៅប្រើនៅក្នុង scope ណាក៏បានដែរ។
នៅក្នុងភាសា Python នៅពេលដែលយើងយកវត្ថុណាមួយមកប្រើ ការស្វែងរកវត្ថុនោះ ត្រូវធ្វើឡើងតាមគំនូសបំព្រួញដូចខាងក្រោមនេះ៖
បានន័យថា ការស្វែងរកវត្ថុត្រូវធ្វើឡើង ដោយចាប់ផ្តើមនៅក្នុង scope ដែលទីនោះវត្ថុត្រូវបានយកទៅប្រើ រួចបានបន្តទៅ scope ផ្សេងៗទៀត តាមសញ្ញាព្រួញដូចនៅក្នុងរូបខាងលើនេះ រហូតដល់អស់ scope បើនៅតែរកមិនឃើញ។ ពិនិត្យកម្មវិធីខាងក្រោមនេះ៖
global_str = 'global scope.' def enclosing_func(): enclosing_str = 'local scope or enclosing scope.' def nested_func(): nested_str = 'nested scope.' print('global_str is found in', global_str) print('enclosing_str is found in', enclosing_str) print('nested_str is found in', nested_str) nested_func() enclosing_func()
global_str is found in global scope. enclosing_str is found in local scope or enclosing scope. nested_str is found in nested scope.
ដោយការស្វែងរកវត្ថុផ្សេងៗត្រូវប្រព្រឹត្តទៅដូចនៅក្នុងគំនូសបំព្រួញខាងលើ ដូចនេះយើងមិនអាចយកវត្ថុនៅក្នុង scope ផ្នែកខាងក្រោម ទៅប្រើនៅក្នុង scope នៅខាងលើបានឡើយ។ ពិនិត្យកម្មវិធីខាងក្រោមនេះ៖
global_str = 'global scope.' def enclosing_func(): enclosing_str = 'local scope or enclosing scope.' def nested_func(): nested_str = 'nested scope.' nested_func() enclosing_func() print(enclosing_str)
Traceback (most recent call last): File "C:/pythonProject/main.py", line 12, in <module> print(enclosing_str) NameError: name 'enclosing_str' is not defined
វត្ថុនៅក្នុង scope ខុសៗគ្នា គឺជាវត្ថុខុសៗគ្នា ទោះបីជាវត្ថុទាំងនោះមានឈ្មោះដូចគ្នាក៏ដោយ។ ពិនិត្យកម្មវិធីខាងក្រោមនេះ៖
object = 1000 print('In global scope, object is', object) def enclosing_func(): object = True print('In enclosing scope, object is', object) def nested_func(): object = 'sentence' print('In nested scope, object is', object) nested_func() enclosing_func()
In global scope, object is 1000 In enclosing scope, object is True In nested scope, object is sentence
យើងអាចយកវត្ថុនៅក្នុង global scope មកប្រើក្នុង local scope និងឬ nested scope បានមែន តែយើងមិនអាចយកឈ្មោះរបស់វត្ថុទាំងនោះទៅភ្ជាប់នឹងវត្ថុណាផ្សេងទៀតបានឡើយ។ ការប៉ុនប៉ងយកឈ្មោះរបស់វត្ថុទាំងនោះទៅភ្ជាប់នឹងវត្ថុផ្សេងទៀត គឺជាការបង្កើតវត្ថុថ្មីមានឈ្មោះដូចគ្នា នៅក្នុងបណ្តា scope ទាំងនោះ។ ក៏ប៉ុន្តែ បើយើងពិតជាចង់យកឈ្មោះរបស់វត្ថុនៅក្នុង global scope ទៅភ្ជាប់នឹងវត្ថុផ្សេងទៀត នៅក្នុង local scope និងឬ nested scope យើងត្រូវប្រើប្រាស់ statement global ដោយធ្វើដូចខាងក្រោមនេះ៖
object = 1000 object_list = [210, False, 'profit'] def enclosing_func(): global object object = True def nested_func(): global object_list object_list = 'Sentence' nested_func() enclosing_func() print('The new "object" is', object) print('The new "object_list" is', object_list)
The new "object" is True The new "object_list" is Sentence
ចំពោះវត្ថុដែលមានលក្ខណៈ mutable និងដែលស្ថិតនៅក្នុង global scope យើងអាចយកវាមកដោះដូរ element នៅក្នុង local scope និងឬ nested scope បានជាធម្មតា ដោយមិនចាំបាច់ប្រើប្រាស់ statement global ឡើយ។ ដោយហេតុថា ការដោះដូរ element នៅក្នុងវត្ថុដែលជា container មិនមែនជាការយកឈ្មោះរបស់វត្ថុដែលជា container ទៅភ្ជាប់នឹងវត្ថុផ្សេងទៀតឡើយ។ ពិនិត្យកម្មវិធីខាងក្រោមនេះ៖
object_list = [210, False, 'profit'] def enclosing_func(): object_list[0] = True def nested_func(): object_list[1] = 'Sentence' nested_func() enclosing_func() print('The new "object_list" is', object_list)
The new "object_list" is [True, 'Sentence', 'profit']
យ៉ាងណាម៉ិញ យើងអាចយកវត្ថុនៅក្នុង local/enclosing scope មកប្រើនៅក្នុង nested scope បានមែន តែយើងមិនអាចយកឈ្មោះរបស់វត្ថុទាំងនោះទៅភ្ជាប់នឹងវត្ថុផ្សេងទៀតបានឡើយ។ ការប៉ុនប៉ងយកឈ្មោះរបស់វត្ថុទាំងនោះ ទៅភ្ជាប់នឹងវត្ថុផ្សេង គឺជាការបង្កើតវត្ថុមានឈ្មោះដូចគ្នា នៅក្នុង scope ចុងក្រោយនេះ។ ក៏ប៉ុន្តែ បើយើងពិតជាចង់យកឈ្មោះរបស់វត្ថុនៅក្នុង local/enclosing scope ទៅភ្ជាប់នឹងវត្ថុនៅក្នុង nested scope មែន យើងចាំបាច់ត្រូវប្រើប្រាស់ statement nonlocal ដោយធ្វើដូចខាងក្រោមនេះ៖
def enclosing_func(): object = 1000 def nested_func(): nonlocal object object = 'Sentence' nested_func() print('The new "object" is', object) enclosing_func()
The new "object" is Sentence
យ៉ាងណាម៉ិញ ចំពោះវត្ថុដែលស្ថិតនៅក្នុង local scope ដែលជា function ខុសៗគ្នា គឺជាវត្ថុខុសៗគ្នា ទោះបីជាវត្ថុទាំងនោះមានឈ្មោះដូចគ្នាក៏ដោយ។ ដោយហេតុថា function និមួយៗគឺជា scope ដោយឡែកពីគ្នា។ ពិនិត្យកម្មវិធីខាងក្រោមនេះ៖
def get_profit(sale, buy): profit = sale - buy return profit def sum_profit(sale, buy): money = sale + buy + get_profit(sale=sale, buy=buy) print(money) sum_profit(1000, 900)
2000
សរុបមក ឈ្មោះរបស់វត្ថុនៅក្នុងភាសា Python ក៏ដូចជាឈ្មោះរបស់មនុស្សយើងដែរ។ ពោលគឺមនុស្សឈ្មោះ វុធ នៅក្នុងគ្រួសារមួយ ខុសពីមនុស្សឈ្មោះ វុធ នៅក្នុងគ្រួសារមួយទៀត ទោះបីជាមនុស្សទាំងពីរនោះមានឈ្មោះដូចគ្នាក៏ដោយ៕