2.2. Variabler och grundläggande typer

En variabel är ett namn som du binder till ett värde med operatorn =. Efter tilldelningen kan namnet användas överallt där värdet kan användas:

width = 320
height = 240
pixels = width * height
print(pixels)               # prints 76800

Högerledet av = utvärderas först, sedan binds resultatet till namnet till vänster. Att läsa ett namn som aldrig tilldelats orsakar NameError.

En variabel är bara en etikett. Den pekar på ett värde – värdet finns någon annanstans, och samma värde kan ha hur många etiketter som helst.

Tre etiketter som pekar på tre boxade värden; att tilldela om en etikett flyttar pilen, inte värdet.

Variabler är etiketter som pekar på värden. Att tilldela om en variabel flyttar etiketten; det ändrar inte värdet som etiketten brukade peka på.

2.2.1. Namngivningsregler

  • Namn börjar med en bokstav eller ett understreck och får innehålla bokstäver, siffror och understreck. frame_count och _internal är bra; 1st_frame är ett syntaxfel.

  • Namn är skiftlägeskänsliga: Width och width är två olika variabler.

  • Undvik att återanvända inbyggda namn som list, str, id() eller print() – att skugga dem orsakar inget fel, men den ursprungliga inbyggda funktionen blir oåtkomlig under resten av skriptet.

  • Konvention: snake_case för variabler och funktioner, ALL_CAPS för konstanter som du inte tänker ändra, CamelCase för klassnamn.

2.2.2. Grundläggande typer

Varje värde i Python har en typ som bestämmer vilka operationer det stöder. De fyra typer du kommer att skriva mest är:

  • int – heltal, positiva eller negativa. MicroPython-heltal växer så stora som minnet tillåter. Litteraler skrivs som vanliga siffror: 0, 42, -7. Hexadecimala (0x1A), oktala (0o17) och binära (0b1010) litteraler är också giltiga och användbara för register och bitmasker.

  • float – tal med ett decimaltecken eller en exponent: 3.14, 1.0, -0.5, 2e6 (= 2 000 000,0). Alla flyttal på kameran är IEEE 754 32-bitars – exakta till ungefär sju signifikanta siffror.

  • bool – en av de två litteralerna True eller False (observera den stora bokstaven).

  • str – text, skriven som tecken mellan enkla eller dubbla citationstecken: "hello", 'OpenMV'. Båda citatformerna är likvärdiga; välj den som låter dig undvika att escapa de citationstecken som förekommer inuti strängen.

Det finns också ett femte värde som är värt att känna till omedelbart:

  • None – det enda värdet av typen NoneType. Används för att betyda ”inget värde” eller ”inte satt ännu”. Funktioner som inte uttryckligen returnerar något returnerar implicit None.

2.2.3. Kontrollera och konvertera typer

Den inbyggda funktionen type() returnerar typen för vilket värde som helst:

>>> type(42)
<class 'int'>
>>> type(3.14)
<class 'float'>
>>> type("hello")
<class 'str'>

Varje typ fungerar också som en konverteringsfunktion. Ge den ett värde av en annan typ så får du tillbaka motsvarande värde av den nya typen – när konverteringen är väldefinierad:

>>> int("42")
42
>>> int(3.9)
3                           # truncates toward zero, not rounds
>>> float("1.5")
1.5
>>> str(255)
'255'
>>> bool(0), bool(1), bool("")
(False, True, False)

Konverteringar som inte är väldefinierade orsakar ValueError:

>>> int("hello")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid syntax for integer with base 10

2.2.4. Omtilldelning och dynamisk typning

Ett namn kan tilldelas om till ett värde av valfri typ när som helst. Följande är tillåtet:

x = 42
x = "now I'm a string"
x = 3.14

Python binder inte en variabel till en typ. Kod som är beroende av att x är ett heltal förväntar sig helt enkelt ett heltal på den punkt där den använder det; om den får något annat får du ett TypeError vid körning.

Anteckning

Att tilldela om x ändrar inte värdet som den gamla bindningen pekade på. Om två namn delar samma värde påverkar omtilldelning av det ena inte det andra:

a = [1, 2, 3]
b = a                       # both point at the same list
a = "different now"
print(b)                    # still [1, 2, 3]

Att mutera ett delat värde är något annat: en metod som list.append ändrar värdet som bindningen pekar på, så varje annat namn som pekar på samma värde ser ändringen.