FatCap Δημοσ. 2 Μαΐου 2016 Δημοσ. 2 Μαΐου 2016 Ο κωδικας: def func_outer(): x=2 print('x is '), x def func_inner(): nonlocal (x) x=5 func_inner() print('the local x changed to '),xfunc_outer() Μου βγαζει: x is 2 Ενω εγω κανονικα θελω να μου εμφανισει : x is 2 the local x changed to 5 Αν καταλαβα σωστα δεν μπαινει καθολου στην συναρτηση ή δεν αποκτα καθολου προσβαση στην μεταβλητη χ με την εντολη nonlocal. Καμια ιδεα περις τινος προκειται; Δοκιμασα να αλλαξω την εσοχη του func_inner() να την καλεσω κατω ακριβως απο την συναρτηση αλλα μου βγαζει οτι δεν περιμενε τετοια εσοχη στο print('the local x changed to '),x.
Grim Ripper Δημοσ. 2 Μαΐου 2016 Δημοσ. 2 Μαΐου 2016 Εμένα πάλι το Pycharm βγάζει "SyntaxError: invalid syntax".
FatCap Δημοσ. 2 Μαΐου 2016 Μέλος Δημοσ. 2 Μαΐου 2016 Εμένα πάλι το Pycharm βγάζει "SyntaxError: invalid syntax". Αν στο εβγαλε στο nonlocal και εχεις 2.7 να ξερεις πως δεν υποστηριζετε σε αυτην την εκδοση αυτη η εντολη μονο στην 3.4. Αλλιως δοκιμασε να βαλεις παρενθεση στο χ.
pmav99 Δημοσ. 2 Μαΐου 2016 Δημοσ. 2 Μαΐου 2016 Εδώ είναι η απάντηση: http://stackoverflow.com/questions/1261875/python-nonlocal-statement και μετά διάβασε αυτό: http://stackoverflow.com/questions/291978/short-description-of-python-scoping-rules 1
pmav99 Δημοσ. 2 Μαΐου 2016 Δημοσ. 2 Μαΐου 2016 @Grim Ripper Χωρίς το traceback κανείς δεν μπορεί να ξέρει τι έχει γίνει. @FatCap Πρόσεχε λίγο πιο πολύ όταν ποστάρεις κώδικα... + print('the local x changed to'), x - print('the local x changed to', x)
FatCap Δημοσ. 2 Μαΐου 2016 Μέλος Δημοσ. 2 Μαΐου 2016 Εδώ είναι η απάντηση: http://stackoverflow.com/questions/1261875/python-nonlocal-statement και μετά διάβασε αυτό: http://stackoverflow.com/questions/291978/short-description-of-python-scoping-rules Σε ευχαριστω! @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)
pmav99 Δημοσ. 2 Μαΐου 2016 Δημοσ. 2 Μαΐου 2016 Το εβαλα το χ εξω απο την παρενθεση γιατι οταν το βαλω μεσα στην παρενθεση και το τρεξω στο 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)
FatCap Δημοσ. 2 Μαΐου 2016 Μέλος Δημοσ. 2 Μαΐου 2016 Δε νομίζω... Στην 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)
pmav99 Δημοσ. 2 Μαΐου 2016 Δημοσ. 2 Μαΐου 2016 Η default python version σε ubuntu είναι η 2.7... Στην python 2 το print είναι statement και όχι function και έχει διαφορετικά semantics. Αποφάσισε τι έκδοση τρέχεις 1
Grim Ripper Δημοσ. 2 Μαΐου 2016 Δημοσ. 2 Μαΐου 2016 Το command για python 3.x πρέπει να είναι: python3 arxeio.py Σωστά;
FatCap Δημοσ. 3 Μαΐου 2016 Μέλος Δημοσ. 3 Μαΐου 2016 Η 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 Δημοσ. 3 Μαΐου 2016 Μέλος Δημοσ. 3 Μαΐου 2016 Αν και εγκατεστησα Python 3.4.3+ οποτε τα τρεχει τωρα μια χαρα.
k33theod Δημοσ. 3 Μαΐου 2016 Δημοσ. 3 Μαΐου 2016 Γεια και από μένα FatCap Όπως έχεις γράψει τη συνάρτηση func_inner() όταν αυτή εκτελεστεί καλεί τον εαυτό της και δημιουργείται ένας κύκλος που δεν σταματά. Σκέψου ότι μόλις φτάνει στην 3η εντολή που είναι τώρα θα καλείται και θα εκτελεί μετά την 1η και αυτό θα γίνεται συνεχώς. Η εντολή print που έχεις μετά δεν θα εκτελεστεί πότε. Νομίζω ότι δεν θες αυτό οπότε πρέπει σίγουρα να την βγάλεις εκτός του εαυτού της. Η nonlocal λειτουργεί σχεδόν όπως η global. Οι διαφορά είναι ότι ο interpreter ψάχνει μόνο στις εξωτερικές συναρτήσεις να την βρει και εαν δεν την βρει εκεί δεν την δημιουργεί αλλά επιστρέφει error. 1
FatCap Δημοσ. 4 Μαΐου 2016 Μέλος Δημοσ. 4 Μαΐου 2016 Γεια και από μένα FatCap Όπως έχεις γράψει τη συνάρτηση func_inner() όταν αυτή εκτελεστεί καλεί τον εαυτό της και δημιουργείται ένας κύκλος που δεν σταματά. Σκέψου ότι μόλις φτάνει στην 3η εντολή που είναι τώρα θα καλείται και θα εκτελεί μετά την 1η και αυτό θα γίνεται συνεχώς. Η εντολή print που έχεις μετά δεν θα εκτελεστεί πότε. Νομίζω ότι δεν θες αυτό οπότε πρέπει σίγουρα να την βγάλεις εκτός του εαυτού της. Η nonlocal λειτουργεί σχεδόν όπως η global. Οι διαφορά είναι ότι ο interpreter ψάχνει μόνο στις εξωτερικές συναρτήσεις να την βρει και εαν δεν την βρει εκεί δεν την δημιουργεί αλλά επιστρέφει error. Καταλαβα σε ευχαριστω πολυ !!
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα