Python Namespace και πεδίο εφαρμογής μιας μεταβλητής

Σε αυτό το σεμινάριο, θα μάθετε για το χώρο ονομάτων, τη χαρτογράφηση από ονόματα σε αντικείμενα και το εύρος μιας μεταβλητής.

Τι είναι το όνομα στο Python;

Εάν έχετε διαβάσει ποτέ το "The Zen of Python" (πληκτρολογήστε import thisτον διερμηνέα Python), η τελευταία γραμμή δηλώνει ότι τα Namespaces είναι μια υπέροχη ιδέα - ας κάνουμε περισσότερα από αυτά! Λοιπόν, ποιοι είναι αυτοί οι μυστηριώδεις χώροι ονομάτων; Ας δούμε πρώτα ποιο είναι το όνομα.

Το όνομα (ονομάζεται επίσης αναγνωριστικό) είναι απλώς ένα όνομα που δίνεται σε αντικείμενα. Τα πάντα στο Python είναι ένα αντικείμενο. Το όνομα είναι ένας τρόπος πρόσβασης στο υποκείμενο αντικείμενο.

Για παράδειγμα, όταν κάνουμε την ανάθεση a = 2, 2είναι ένα αντικείμενο που είναι αποθηκευμένο στη μνήμη και είναι το όνομα με το οποίο συσχετίζουμε. Μπορούμε να λάβουμε τη διεύθυνση (σε RAM) κάποιου αντικειμένου μέσω της ενσωματωμένης συνάρτησης id(). Ας δούμε πώς να το χρησιμοποιήσουμε.

 # Note: You may get different values for the id a = 2 print('id(2) =', id(2)) print('id(a) =', id(a))

Παραγωγή

 id (2) = 9302208 id (a) = 9302208

Εδώ, και οι δύο αναφέρονται στο ίδιο αντικείμενο 2, οπότε έχουν το ίδιο id(). Ας κάνουμε τα πράγματα λίγο πιο ενδιαφέροντα.

 # Note: You may get different values for the id a = 2 print('id(a) =', id(a)) a = a+1 print('id(a) =', id(a)) print('id(3) =', id(3)) b = 2 print('id(b) =', id(b)) print('id(2) =', id(2))

Παραγωγή

 id (a) = 9302208 id (a) = 9302240 id (3) = 9302240 id (b) = 9302208 id (2) = 9302208

Τι συμβαίνει στην παραπάνω ακολουθία βημάτων; Ας χρησιμοποιήσουμε ένα διάγραμμα για να το εξηγήσουμε αυτό:

Διάγραμμα μνήμης μεταβλητών στο Python

Αρχικά, δημιουργείται ένα αντικείμενο 2και το όνομα a σχετίζεται με αυτό, όταν το κάνουμε a = a+1, δημιουργείται ένα νέο αντικείμενο 3και τώρα ένα συσχετίζεται με αυτό το αντικείμενο.

Σημειώστε ότι id(a)και id(3)έχετε τις ίδιες τιμές.

Επιπλέον, όταν b = 2εκτελείται, το νέο όνομα b συσχετίζεται με το προηγούμενο αντικείμενο 2.

Αυτό είναι αποτελεσματικό καθώς η Python δεν χρειάζεται να δημιουργήσει ένα νέο διπλό αντικείμενο. Αυτή η δυναμική φύση της δεσμευτικής ονομασίας κάνει την Python ισχυρή. ένα όνομα θα μπορούσε να αναφέρεται σε οποιονδήποτε τύπο αντικειμένου.

 >>> a = 5 >>> a = 'Hello World!' >>> a = (1,2,3)

Όλα αυτά είναι έγκυρα και θα αναφέρονται σε τρεις διαφορετικούς τύπους αντικειμένων σε διαφορετικές περιπτώσεις. Οι συναρτήσεις είναι επίσης αντικείμενα, οπότε ένα όνομα μπορεί να αναφέρεται και σε αυτά.

 def printHello(): print("Hello") a = printHello a()

Παραγωγή

 Χαίρετε

Το ίδιο όνομα a μπορεί να αναφέρεται σε μια συνάρτηση και μπορούμε να καλέσουμε τη συνάρτηση χρησιμοποιώντας αυτό το όνομα.

Τι είναι το Namespace στο Python;

Τώρα που καταλαβαίνουμε τι είναι τα ονόματα, μπορούμε να προχωρήσουμε στην έννοια των ονομάτων.

Με απλά λόγια, ένας χώρος ονομάτων είναι μια συλλογή ονομάτων.

Στο Python, μπορείτε να φανταστείτε έναν χώρο ονομάτων ως αντιστοίχιση κάθε ονόματος που έχετε ορίσει σε αντίστοιχα αντικείμενα.

Διαφορετικοί χώροι ονομάτων μπορούν να συνυπάρχουν σε μια δεδομένη στιγμή αλλά είναι εντελώς απομονωμένοι.

Ένας χώρος ονομάτων που περιέχει όλα τα ενσωματωμένα ονόματα δημιουργείται όταν ξεκινάμε τον διερμηνέα Python και υπάρχει όσο εκτελείται ο διερμηνέας.

Αυτός είναι ο λόγος που οι ενσωματωμένες λειτουργίες όπως id(), print()κ.λπ., είναι πάντα διαθέσιμες σε εμάς από οποιοδήποτε μέρος του προγράμματος. Κάθε ενότητα δημιουργεί τον δικό της παγκόσμιο χώρο ονομάτων.

Αυτοί οι διαφορετικοί χώροι ονομάτων είναι απομονωμένοι. Ως εκ τούτου, το ίδιο όνομα που μπορεί να υπάρχει σε διαφορετικές ενότητες δεν συγκρούονται.

Οι ενότητες μπορούν να έχουν διάφορες λειτουργίες και τάξεις. Ένας τοπικός χώρος ονομάτων δημιουργείται όταν καλείται μια συνάρτηση, η οποία έχει όλα τα ονόματα που ορίζονται σε αυτήν. Παρόμοια, ισχύει για την τάξη. Το ακόλουθο διάγραμμα μπορεί να βοηθήσει στην αποσαφήνιση αυτής της έννοιας.

Ένα διάγραμμα διαφορετικών χώρων ονομάτων στο Python

Μεταβλητό εύρος Python

Παρόλο που υπάρχουν διάφοροι μοναδικοί χώροι ονομάτων, ενδέχεται να μην είμαστε σε θέση να αποκτήσουμε πρόσβαση σε όλα αυτά από κάθε μέρος του προγράμματος. Η έννοια του πεδίου μπαίνει στο παιχνίδι.

Ένα εύρος είναι το τμήμα ενός προγράμματος από το οποίο μπορεί να έχει άμεση πρόσβαση ένας χώρος ονομάτων χωρίς κανένα πρόθεμα.

Σε οποιαδήποτε δεδομένη στιγμή, υπάρχουν τουλάχιστον τρία ένθετα πεδία.

  1. Πεδίο εφαρμογής της τρέχουσας λειτουργίας που έχει τοπικά ονόματα
  2. Πεδίο εφαρμογής της ενότητας που έχει καθολικά ονόματα
  3. Εξώτατο εύρος με ενσωματωμένα ονόματα

Όταν γίνεται αναφορά σε μια συνάρτηση, το όνομα πραγματοποιείται αναζήτηση στον τοπικό χώρο ονομάτων, στη συνέχεια στον καθολικό χώρο ονομάτων και τέλος στον ενσωματωμένο χώρο ονομάτων.

Εάν υπάρχει μια συνάρτηση μέσα σε μια άλλη συνάρτηση, ένα νέο εύρος τοποθετείται εντός του τοπικού πεδίου.

Παράδειγμα πεδίου εφαρμογής και ονομάτων στο Python

 def outer_function(): b = 20 def inner_func(): c = 30 a = 10

Here, the variable a is in the global namespace. Variable b is in the local namespace of outer_function() and c is in the nested local namespace of inner_function().

When we are in inner_function(), c is local to us, b is nonlocal and a is global. We can read as well as assign new values to c but can only read b and a from inner_function().

If we try to assign as a value to b, a new variable b is created in the local namespace which is different than the nonlocal b. The same thing happens when we assign a value to a.

However, if we declare a as global, all the reference and assignment go to the global a. Similarly, if we want to rebind the variable b, it must be declared as nonlocal. The following example will further clarify this.

 def outer_function(): a = 20 def inner_function(): a = 30 print('a =', a) inner_function() print('a =', a) a = 10 outer_function() print('a =', a)

As you can see, the output of this program is

 a = 30 a = 20 a = 10

Σε αυτό το πρόγραμμα, τρεις διαφορετικές μεταβλητές α ορίζονται σε ξεχωριστούς χώρους ονομάτων και έχουν πρόσβαση ανάλογα. Ενώ βρίσκεστε στο ακόλουθο πρόγραμμα,

 def outer_function(): global a a = 20 def inner_function(): global a a = 30 print('a =', a) inner_function() print('a =', a) a = 10 outer_function() print('a =', a)

Η έξοδος του προγράμματος είναι.

 α = 30 α = 30 α = 30 

Εδώ, όλες οι αναφορές και οι αναθέσεις αφορούν το παγκόσμιο λόγω της χρήσης λέξεων-κλειδιών global.

ενδιαφέροντα άρθρα...