Перейти до змісту

Змінні

Змінні в Python не вимагають оголошення типу змінної (оскільки Python – мова з динамічною типізацією) і є посиланнями на область пам'яті. Правила іменування змінних:

  • ім'я змінної може складатися лише з літер, цифр та знака підкреслення
  • ім'я не може починатися із цифри
  • ім'я не може містити спеціальних символів @, $, %

Приклад створення змінних у Python:

In [1]: a = 3

In [2]: b = 'Hello'

In [3]: c, d = 9, 'Test'

In [4]: print(a,b,c,d)
3 Hello 9 Test

Зверніть увагу, що в Python не потрібно вказувати, що a це число, а b це рядок.

Імена змінних

Імена змінних не повинні перетинатися з назвами операторів та модулів або інших зарезервованих слів. У Python є рекомендації щодо іменування функцій, класів та змінних:

  • імена змінних зазвичай пишуться або повністю великими або маленькими літерами (наприклад DB_NAME, db_name)
  • імена функцій задаються маленькими літерами, з підкреслення між словами (наприклад, get_names)
  • імена класів задаються словами з великими літерами без пробілів, це звані CamelCase (наприклад, CiscoSwitch)

В Python змінні це посилання

В Python змінні це посилання на об'єкти:

  • об'єкт не зберігається у змінній
  • змінна це посилання на реальний об'єкт у пам'яті

Приклад коду

vlans_sw1 = [10, 20, 30, 50]
vlans_sw2 = [15, 16, 17, 18]
host = "10.1.1.1"

Ліворуч створені змінні, праворуч - відповідні об'єкти у пам'яті:

vars1

Змінну можна сприймати як ярлик чи тег реальних даних. Наприклад, ми можемо створити дві змінні, які посилатимуться на той самий список (тобто два теги):

vlans_sw1 = vlans_sw2 = [10, 20, 30, 50]

як це виглядає схематично:

vars2

Тепер один і той самий об'єкт доступний за двома іменами.

Приклад

На роботі до вас звертаються, наприклад, Олександр, а дома - Сашко, це два імені, але однієї людини.

Список це змінюваний тип данних, тому в цьому випадку дуже важливо те, що дві змінні посилаються на той самий об'єкт. Зміна об'єкту через будь-яку зі змінних, змінює той самий об'єкт. Наприклад, якщо змінити список через змінну vlans_sw1:

vlans_sw1.append(100)

І після цього дати команду print для обох змінних, vlan 100 з'явиться в обох випадках:

In [1]: vlans_sw1 = vlans_sw2 = [10, 20, 30, 50]

In [2]: vlans_sw1.append(100)

In [3]: print(vlans_sw1)
[10, 20, 30, 50, 100]

In [4]: print(vlans_sw2)
[10, 20, 30, 50, 100]

Функція id дозволяє подивитися адресу об'єкту в пам'яті. Для змінних vlans_sw1, vlans_sw2 зараз ця адреса будет однакова:

In [5]: id(vlans_sw1)
Out[5]: 139810203190848

In [6]: id(vlans_sw2)
Out[6]: 139810203190848

Якщо знов створити два різні списки з двома різними змінними, id будуть різні:

In [8]: vlans_sw1 = [10, 20, 30, 50]

In [9]: vlans_sw2 = [15, 16, 17, 18]

In [10]: id(vlans_sw1)
Out[10]: 139810203155072

In [11]: id(vlans_sw2)
Out[11]: 139810181687744

Ще один важливий момент: коли змінна вказується у виразі праворуч від знаку рівності, вона завжди замінюється значенням (об'єктом) на яке вона посилається.

In [12]: sw1 = "10.1.1.1"

In [13]: sw2 = "10.2.2.2"

In [14]: ip_list = [sw1, sw2, "10.3.3.3"]

In [15]: ip_list
Out[15]: ['10.1.1.1', '10.2.2.2', '10.3.3.3']

В списку ip_list знаходяться рядки '10.1.1.1' та '10.2.2.2', а не змінні sw1, sw2.

Схематичне зображення посилань:

vars3

Елементи списку це посилання на інші об'єкти.

Id об'єкту на який посилається змінна sw1, та id першого елементу списку ip_list - однакові:

In [16]: id(sw1)
Out[16]: 139810202863408

In [17]: id(ip_list[0])
Out[17]: 139810202863408

Всі ці моменти зі змінними мають найбільше значенне при використанні змінюваних типів данних. Важливо розуміти, що зазначення змінної в якомусь виразі Python, підставляє замість змінної об'єкт, на який посилається змінна і саме той самий об'єкт, а не його копію.

Наприклад, вираз vlans_sw2 = vlans_sw1 означає, що змінна vlans_sw2 буде посиланням на той самий список, що і змінна vlans_sw1:

In [19]: vlans_sw1 = [10, 20, 30, 50]

In [20]: vlans_sw2 = vlans_sw1

vars2