Χρήση παγκόσμιων μεταβλητών σε μια συνάρτηση

Πώς μπορώ να δημιουργήσω ή να χρησιμοποιήσω μια παγκόσμια μεταβλητή σε μια συνάρτηση;

Αν δημιουργήσω μια παγκόσμια μεταβλητή σε μια συνάρτηση, πώς μπορώ να χρησιμοποιήσω αυτή την παγκόσμια μεταβλητή σε μια άλλη συνάρτηση; Πρέπει να αποθηκεύσω την παγκόσμια μεταβλητή σε μια τοπική μεταβλητή της συνάρτησης που χρειάζεται την πρόσβασή της;

Λύση

Μπορείτε να χρησιμοποιήσετε μια παγκόσμια μεταβλητή σε άλλες συναρτήσεις δηλώνοντάς την ως global σε κάθε συνάρτηση που της αναθέτει:

globvar = 0

def set_globvar_to_one():
    global globvar    # Needed to modify global copy of globvar
    globvar = 1

def print_globvar():
    print(globvar)     # No need for global declaration to read value of globvar

set_globvar_to_one()
print_globvar()       # Prints 1

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

Δείτε άλλες απαντήσεις αν θέλετε να μοιραστείτε μια παγκόσμια μεταβλητή σε διάφορες ενότητες.

Σχόλια (13)

Ίσως θελήσετε να εξερευνήσετε την έννοια των namespaces. Στην Python, το module είναι το φυσικό μέρος για παγκόσμια δεδομένα:

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

Μια συγκεκριμένη χρήση της global-in-a-module περιγράφεται εδώ - How do I share global variables across modules?, και για λόγους πληρότητας τα περιεχόμενα μοιράζονται εδώ:

Ο κανονικός τρόπος για να μοιραστείτε πληροφορίες μεταξύ των ενοτήτων μέσα σε ένα πρόγραμμα είναι να δημιουργήσετε μια ειδική ενότητα ρυθμίσεων (συχνά ονομάζεται config ή cfg). Απλά εισάγετε την ενότητα διαμόρφωσης σε όλες τις ενότητες της εφαρμογής σας- η ενότητα τότε γίνεται διαθέσιμη ως παγκόσμιο όνομα. Επειδή υπάρχει μόνο μία περίπτωση κάθε ενότητας, οποιεσδήποτε αλλαγές γίνονται στο αντικείμενο της ενότητας αντανακλώνται παντού. Για παράδειγμα:

Αρχείο: config.py

x = 0 # Προεπιλεγμένη τιμή της ρύθμισης διαμόρφωσης 'x'

Αρχείο: mod.py &gt, import config config.x = 1

Αρχείο: main.py &gt, import config import mod print config.x

Σχόλια (2)

Αν θέλετε να αναφερθείτε σε μια παγκόσμια μεταβλητή σε μια συνάρτηση, μπορείτε να χρησιμοποιήσετε τη λέξη-κλειδί global για να δηλώσετε ποιες μεταβλητές είναι παγκόσμιες. Δεν χρειάζεται να το χρησιμοποιείτε σε όλες τις περιπτώσεις (όπως κάποιος εδώ ισχυρίζεται λανθασμένα) - αν το όνομα που αναφέρεται σε μια έκφραση δεν μπορεί να βρεθεί στην τοπική εμβέλεια ή στις εμβέλειες των συναρτήσεων στις οποίες ορίζεται αυτή η συνάρτηση, αναζητείται μεταξύ των παγκόσμιων μεταβλητών.

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

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

Σχόλια (1)