PDA

Visualizza la versione completa : [PYTHON] Variabili globali e locali


plexott
09-10-2011, 11:55
Ho iniziato a scrivere un piccolo gioco in python.
All'inizio creo la variabile money = 100. Poi, all'interno di una funzione, il giocatore vince o perde dei soldi e devo aggiornare la variabile. A quanto ho capito per vedere il valore della variabile basta richiamarla semplicemente, mentre per cambiare il suo valore devo prima specificare "global money" e poi cambiarlo.

Però ottengo questo errore:

fruit.py:49: SyntaxWarning: name 'money' is used prior to global declaration
global money
fruit.py:53: SyntaxWarning: name 'money' is assigned to before global declaration
global money
fruit.py:58: SyntaxWarning: name 'money' is assigned to before global declaration
global money
fruit.py:63: SyntaxWarning: name 'money' is assigned to before global declaration
global money


(ho una serie di if/else per i vari casi che si possono presentare, e quelle indicate sono tutte le righe in cui compare "global money")

se invece provo a togliere tutti i "global money" mi da l'errore

UnboundLocalError: local variable 'money' referenced before assignment


Dov'è che sbaglio?

clynamen
09-10-2011, 13:21
In realtà non si dovrebbero usare variabili globali, comunque potresti postare il codice?

plexott
09-10-2011, 14:23
#! /usr/bin/env python
# -*- coding: iso-8859-1 -*-

# Fruit machine


import random
import math


#creo variabili
money = 100
puntato = 0


def inizio():

#una serie di print con le spiegazioni
gioco()


def gioco():

print "Hai", money, "$.",
puntato_input = raw_input("Quanto vuoi puntare? ")
global puntato
puntato = int(puntato_input)

#attesa input
aa = raw_input("Premi Invio per giocare")

#Estrazione 3 numeri
risultati = []
for i in range(3):
cosa = int(math.ceil(random.random()*7))
risultati.append(cosa)

print "Ho ottenuto", risultati

#output
if ((risultati[0] == risultati[1]) and (risultati[1] == risultati[2])):
if risultati[0] == 1:
print "Tris di 1 !!! Hai vinto 300 volte la puntata!!!"
#global money
money += (299 * puntato)
else:
print "Tris! Hai vinto 40 volte la puntata!"
#global money
money += (39 * puntato)

elif ((risultati[0] == risultati[1]) or (risultati[0] == risultati[2])) or (risultati[1] == risultati[2]):
print "Coppia! Hai vinto 3 volte la puntata"
#global money
money += (2 * puntato)

else:
print "Hai perso"
#global money
money -= puntato




gioco()




inizio()

plexott
09-10-2011, 14:24
(nel postare il codice ha perso l'indentazione, ma nell'originale c'è)

MItaly
09-10-2011, 14:47
Originariamente inviato da plexott
(nel postare il codice ha perso l'indentazione, ma nell'originale c'è)
Usa il tag
per preservare l'indentazione.

Originariamente inviato da plexott
[code]
#! /usr/bin/env python
# -*- coding: iso-8859-1 -*-

# Fruit machine


import random
import math


#creo variabili
money = 100
puntato = 0


def inizio():

#una serie di print con le spiegazioni
gioco()


def gioco():

print "Hai", money, "$.",
puntato_input = raw_input("Quanto vuoi puntare? ")
global puntato
puntato = int(puntato_input)

#attesa input
aa = raw_input("Premi Invio per giocare")

#Estrazione 3 numeri
risultati = []
for i in range(3):
cosa = int(math.ceil(random.random()*7))
risultati.append(cosa)

print "Ho ottenuto", risultati

#output
if ((risultati[0] == risultati[1]) and (risultati[1] == risultati[2])):
if risultati[0] == 1:
print "Tris di 1 !!! Hai vinto 300 volte la puntata!!!"
#global money
money += (299 * puntato)
else:
print "Tris! Hai vinto 40 volte la puntata!"
#global money
money += (39 * puntato)

elif ((risultati[0] == risultati[1]) or (risultati[0] == risultati[2])) or (risultati[1] == risultati[2]):
print "Coppia! Hai vinto 3 volte la puntata"
#global money
money += (2 * puntato)

else:
print "Hai perso"
#global money
money -= puntato




gioco()




inizio()

plexott
09-10-2011, 17:16
ho risolto da solo.. per cambiare valore di una variabile globale da dentro una funzione devo scrivere così:

globals()["money"] += 50

..funziona, e sono scomparsi gli errori!

Loading