Προς το περιεχόμενο

Python 3 πρόβλημα με εντολή nonlocal.


FatCap

Προτεινόμενες αναρτήσεις

Ο κωδικας:

 

def func_outer():  
    x=2
    print('x is '), x
    
    def func_inner():
            nonlocal (x)
            x=5
            func_inner()
            print('the local x changed to '),x
func_outer()

 

 

Μου βγαζει: x is 2

Ενω εγω κανονικα θελω να μου εμφανισει : x is 2

                                                                    the local x changed to 5

 

Αν καταλαβα σωστα δεν μπαινει καθολου στην συναρτηση ή δεν αποκτα καθολου προσβαση στην μεταβλητη χ με την εντολη nonlocal. Καμια ιδεα περις τινος προκειται; :huh:

 

Δοκιμασα να αλλαξω την εσοχη του func_inner() να την καλεσω κατω ακριβως απο την συναρτηση αλλα μου βγαζει οτι δεν περιμενε τετοια εσοχη στο print('the local x changed to '),x.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Εμένα πάλι το Pycharm βγάζει "SyntaxError: invalid syntax".

Αν στο εβγαλε στο nonlocal και εχεις 2.7 να ξερεις πως δεν υποστηριζετε σε αυτην την εκδοση αυτη η εντολη μονο στην 3.4.

Αλλιως δοκιμασε να βαλεις παρενθεση στο χ.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

@Grim Ripper

Χωρίς το traceback κανείς δεν μπορεί να ξέρει τι έχει γίνει.

 

@FatCap

Πρόσεχε λίγο πιο πολύ όταν ποστάρεις κώδικα...

+ print('the local x changed to'), x
- print('the local x changed to', x)
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Σε ευχαριστω!

 

@Grim Ripper

Χωρίς το traceback κανείς δεν μπορεί να ξέρει τι έχει γίνει.

 

@FatCap

Πρόσεχε λίγο πιο πολύ όταν ποστάρεις κώδικα...

+ print('the local x changed to'), x
- print('the local x changed to', x)

Το εβαλα το χ εξω απο την παρενθεση γιατι οταν το βαλω μεσα στην παρενθεση και το τρεξω στο terminal θα μου το εμφανισει ετσι ('the local x changed to', x)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το εβαλα το χ εξω απο την παρενθεση γιατι οταν το βαλω μεσα στην παρενθεση και το τρεξω στο terminal θα μου το εμφανισει ετσι ('the local x changed to', x)

 

Δε νομίζω... Στην python 3 το print() είναι ένα function που (από default) γράφει στο sys.stdout και που επιστρέφει None. Κατα συνέπεια το:

x = 3
print('the local x changed to'), x
print(type((print('the local x changed to'), x)))

Θα τυπώσει τα εξής:

the local x changed to
the local x changed to
<class 'tuple'>

Εν ολίγοις δηλαδή, το

print('the local x changed to'), x

Είναι το εξής tuple:

(None, x)

Αυτό που κατά πάσα πιθανότητα εσύ έκανες είναι το εξής:

print('the local x changed to x')

Το οποίο προφανώς και τυπώνει αυτό που έγραψες στο προηγούμενο μήνυμα.

Ενώ, αυτό που μάλλον ήθελες να γράψεις είναι κάτι τέτοιο:

print('the local x changed to %d', x)
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

 

Δε νομίζω... Στην python 3 το print() είναι ένα function που (από default) γράφει στο sys.stdout και που επιστρέφει None. Κατα συνέπεια το:

x = 3
print('the local x changed to'), x
print(type((print('the local x changed to'), x)))

Θα τυπώσει τα εξής:

the local x changed to
the local x changed to
<class 'tuple'>

Εν ολίγοις δηλαδή, το

print('the local x changed to'), x

Είναι το εξής tuple:

(None, x)

Αυτό που κατά πάσα πιθανότητα εσύ έκανες είναι το εξής:

print('the local x changed to x')

Το οποίο προφανώς και τυπώνει αυτό που έγραψες στο προηγούμενο μήνυμα.

Ενώ, αυτό που μάλλον ήθελες να γράψεις είναι κάτι τέτοιο:

print('the local x changed to %d', x)

 2whnytf.jpg21dq6ax.jpg

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Η default python version σε ubuntu είναι η 2.7...

 

Στην python 2 το print είναι statement και όχι function και έχει διαφορετικά semantics.

 

Αποφάσισε τι έκδοση τρέχεις

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Η default python version σε ubuntu είναι η 2.7...

 

Στην python 2 το print είναι statement και όχι function και έχει διαφορετικά semantics.

 

Αποφάσισε τι έκδοση τρέχεις

Ειναι 2.7 αλλα επειδη δεν μπορουσα να τρεξω την εντολη nonlocal στην 2.7 .Εφτιαξα στο terminal μεσω του nano το αρχειο test.py και  εγραψα #!/usr/bin/python3 για να μπορω να τo τρεξω.Δεν μου εβγαλε καποιο error απλως δεν την εκτελουσε..ισχυει η εντολη που εγραψα;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Γεια και από μένα

FatCap

Όπως έχεις γράψει τη συνάρτηση func_inner() όταν αυτή εκτελεστεί καλεί τον εαυτό της και δημιουργείται ένας κύκλος που δεν σταματά.

Σκέψου ότι μόλις φτάνει στην 3η εντολή που είναι τώρα θα καλείται και θα εκτελεί μετά την 1η και αυτό θα γίνεται συνεχώς. Η εντολή print που έχεις μετά δεν θα εκτελεστεί πότε.

Νομίζω ότι δεν θες αυτό οπότε πρέπει σίγουρα να την βγάλεις εκτός του εαυτού της.

Η nonlocal λειτουργεί σχεδόν όπως η global. Οι διαφορά είναι ότι ο interpreter ψάχνει μόνο στις εξωτερικές συναρτήσεις να την βρει και εαν δεν την βρει εκεί δεν την δημιουργεί αλλά επιστρέφει error.

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Γεια και από μένα

FatCap

Όπως έχεις γράψει τη συνάρτηση func_inner() όταν αυτή εκτελεστεί καλεί τον εαυτό της και δημιουργείται ένας κύκλος που δεν σταματά.

Σκέψου ότι μόλις φτάνει στην 3η εντολή που είναι τώρα θα καλείται και θα εκτελεί μετά την 1η και αυτό θα γίνεται συνεχώς. Η εντολή print που έχεις μετά δεν θα εκτελεστεί πότε.

Νομίζω ότι δεν θες αυτό οπότε πρέπει σίγουρα να την βγάλεις εκτός του εαυτού της.

Η nonlocal λειτουργεί σχεδόν όπως η global. Οι διαφορά είναι ότι ο interpreter ψάχνει μόνο στις εξωτερικές συναρτήσεις να την βρει και εαν δεν την βρει εκεί δεν την δημιουργεί αλλά επιστρέφει error.

Καταλαβα σε ευχαριστω πολυ !!  :-)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...