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.

Three labels pointing at three boxed values; reassigning a label moves the arrow, not the value.

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.

Observera

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.