Variables and Types#

No programs works without variables to store data values in while the program runs. Variables in Python are strong dynamically typed which mean you can change a variable from a number to a string by assignment, but a variable will not become a number when a string contains a number for example. This also means you may have to cast variable from a number to a string in some cases or vice versa.

Python has the following data types built-in by default, listed per category in the table below:

Category

Data type

Text Type:

str

Numeric Types:

int, float, complex

Sequence Types:

list, tuple, range

Mapping Type:

dict

Set Types:

set, frozenset

Boolean Type:

bool

Binary Types:

bytes, bytearray, memoryview

The basics about variables#

Let start with basic example based on our Hello World. application where we have two lines. And in this example we still present print directly with a string telling about two people called John and Jack, and their age.

Example: Printing strings directly#
1 #!/usr/bin/env python3
2
3 def main():
4     print("My name is John and I am 42.")
5     print("My name is Jack and I am also 42.")
6
7
8 if __name__ == "__main__":
9     main()
Output: Printing strings directly#
1 My name is John and I am 42.
2 My name is Jack and I am also 42

Lets put the name and age both in their own variable as a string and update the strings to concatenate the whole string together. Here we that Python used the +-sign to concatenate strings together.

Example: Printing concatenated strings#
 1 #!/usr/bin/env python3
 2
 3 def main():
 4     name = "John"
 5     age = "42"
 6     print("My name is " + name + " and I am " + age + ".")
 7     name = "Jack"
 8     print("My name is " + name + " and I am also " + age + ".")
 9
10
11 if __name__ == "__main__":
12     main()
Output: Printing concatenated strings#
1 My name is John and I am 42.
2 My name is Jack and I am also 42

Getting a variable type#

Python can also determine the data type of a variable with type(). This can become useful when importing data from unknown source and needs validation, or to determine if a variable needs to be casted.

Example: Determine the variable type#
 1 #!/usr/bin/env python3
 2
 3 def main():
 4     name = "John"
 5     age = 42
 6     print(type(name))
 7     print(type(age))
 8
 9
10 if __name__ == "__main__":
11     main()
Output: Determine the variable type#
1 <class 'str'>
2 <class 'int'>

Casting variables#

Python is flexible with its data types for variables, but Python does require type casting in some cases. Using a variable that contains a number that needs to concatenated with a string needs to be casted from an integer to a string. In the example below we forget to type cast a string and it fails.

Example: Invalid casting of an integer#
 1 #!/usr/bin/env python3
 2
 3 def main():
 4     name = "John"
 5     age = 42
 6     print("My name is " + name + " and I am " + age + ".")
 7
 8
 9 if __name__ == "__main__":
10     main()
Output: Invalid casting of an integer#
1 Traceback (most recent call last):
2   File "/workspaces/mastering-python/example.py", line 10, in <module>
3     main()
4   File "/workspaces/mastering-python/example.py", line 6, in main
5     print("My name is " + name + " and I am " + age + ".")
6 TypeError: can only concatenate str (not "int") to str

If we type cast the variable age from integer to string with the str() function it works perfectly. Other functions to type cast are int() and float().

Example: Casting an integer to a string#
 1 #!/usr/bin/env python3
 2
 3 def main():
 4     name = "John"
 5     age = 42
 6     print("My name is " + name + " and I am " + str(age) + ".")
 7
 8
 9 if __name__ == "__main__":
10     main()

Variable scope#

Variables are scope sensitive and in the example below we define the variable on a global level and can be read scopes of functions and methods. Having global variables isn’t a good idea as it leads to messy programming. For constants this is fine, but the variables should only be read from and not updated.

Example#
 1 #!/usr/bin/env python3
 2
 3 phrase = "Hello World."
 4
 5 def main():
 6     print(phrase)
 7
 8
 9 if __name__ == "__main__":
10     main()
Output#
1 Hello World.

Variables can have a global and local scope. In the example below we set the variable on a global level, but override it with a different value as a local variable.

Example#
 1 #!/usr/bin/env python3
 2
 3 phrase = "Hello World."
 4
 5 def main():
 6     phrase = "Hello People."
 7     print(phrase)
 8
 9
10 if __name__ == "__main__":
11     main()
Output#
1 Hello People.

Python also has the option to turn local variables in global variables as in the example below. The extra function setup() uses the keyword global to make the variable x a global variable.

Example#
 1 #!/usr/bin/env python3
 2
 3 phrase = "Hello World."
 4
 5 def setup():
 6     global phrase
 7     phrase = "Hello People."
 8
 9
10 def main():
11     print(phrase)
12
13
14 if __name__ == "__main__":
15     setup()
16     main()
Output#
1 Hello People.

Warning

Using global variables is considert bad programming and a risk as it can have unforeseen effects.

Variables are references#

Variables in Python don’t store the value assigned to them, but are a reference to where the value is stored in memory. With the function id() an unique identifier is returend for every object stored in memory, and for the CPython implementation this identifier matches the address in memory.

As Python works with references, copying a variable is in reality copying the reference towards the value and not the value itself. The example below shows this as the reference for var1 and var2 are the same after copying, and only changes for var2 when a new value is assigned.

Example: Copying variables and assigning a new value.#
 1 #!/usr/bin/env python3
 2
 3 def main():
 4     var1 = 'test string 1'
 5     var2 = var1
 6     print(id(var1))
 7     print(id(var2))
 8     var2 = 'test string 2'
 9     print(id(var2))
10
11
12 if __name__ == "__main__":
13     main()
Output: Copying variables and assigning a new value.#
1 140676515962032
2 140676515962032
3 140676516592816