• Module 2: The Essentials of Python »
  • Variables & Assignment
  • View page source

Variables & Assignment 

There are reading-comprehension exercises included throughout the text. These are meant to help you put your reading to practice. Solutions for the exercises are included at the bottom of this page.

Variables permit us to write code that is flexible and amendable to repurpose. Suppose we want to write code that logs a student’s grade on an exam. The logic behind this process should not depend on whether we are logging Brian’s score of 92% versus Ashley’s score of 94%. As such, we can utilize variables, say name and grade , to serve as placeholders for this information. In this subsection, we will demonstrate how to define variables in Python.

In Python, the = symbol represents the “assignment” operator. The variable goes to the left of = , and the object that is being assigned to the variable goes to the right:

Attempting to reverse the assignment order (e.g. 92 = name ) will result in a syntax error. When a variable is assigned an object (like a number or a string), it is common to say that the variable is a reference to that object. For example, the variable name references the string "Brian" . This means that, once a variable is assigned an object, it can be used elsewhere in your code as a reference to (or placeholder for) that object:

Valid Names for Variables 

A variable name may consist of alphanumeric characters ( a-z , A-Z , 0-9 ) and the underscore symbol ( _ ); a valid name cannot begin with a numerical value.

var : valid

_var2 : valid

ApplePie_Yum_Yum : valid

2cool : invalid (begins with a numerical character)

I.am.the.best : invalid (contains . )

They also cannot conflict with character sequences that are reserved by the Python language. As such, the following cannot be used as variable names:

for , while , break , pass , continue

in , is , not

if , else , elif

def , class , return , yield , raises

import , from , as , with

try , except , finally

There are other unicode characters that are permitted as valid characters in a Python variable name, but it is not worthwhile to delve into those details here.

Mutable and Immutable Objects 

The mutability of an object refers to its ability to have its state changed. A mutable object can have its state changed, whereas an immutable object cannot. For instance, a list is an example of a mutable object. Once formed, we are able to update the contents of a list - replacing, adding to, and removing its elements.

To spell out what is transpiring here, we:

Create (initialize) a list with the state [1, 2, 3] .

Assign this list to the variable x ; x is now a reference to that list.

Using our referencing variable, x , update element-0 of the list to store the integer -4 .

This does not create a new list object, rather it mutates our original list. This is why printing x in the console displays [-4, 2, 3] and not [1, 2, 3] .

A tuple is an example of an immutable object. Once formed, there is no mechanism by which one can change of the state of a tuple; and any code that appears to be updating a tuple is in fact creating an entirely new tuple.

Mutable & Immutable Types of Objects 

The following are some common immutable and mutable objects in Python. These will be important to have in mind as we start to work with dictionaries and sets.

Some immutable objects

numbers (integers, floating-point numbers, complex numbers)

“frozen”-sets

Some mutable objects

dictionaries

NumPy arrays

Referencing a Mutable Object with Multiple Variables 

It is possible to assign variables to other, existing variables. Doing so will cause the variables to reference the same object:

What this entails is that these common variables will reference the same instance of the list. Meaning that if the list changes, all of the variables referencing that list will reflect this change:

We can see that list2 is still assigned to reference the same, updated list as list1 :

In general, assigning a variable b to a variable a will cause the variables to reference the same object in the system’s memory, and assigning c to a or b will simply have a third variable reference this same object. Then any change (a.k.a mutation ) of the object will be reflected in all of the variables that reference it ( a , b , and c ).

Of course, assigning two variables to identical but distinct lists means that a change to one list will not affect the other:

Reading Comprehension: Does slicing a list produce a reference to that list?

Suppose x is assigned a list, and that y is assigned a “slice” of x . Do x and y reference the same list? That is, if you update part of the subsequence common to x and y , does that change show up in both of them? Write some simple code to investigate this.

Reading Comprehension: Understanding References

Based on our discussion of mutable and immutable objects, predict what the value of y will be in the following circumstance:

Reading Comprehension Exercise Solutions: 

Does slicing a list produce a reference to that list?: Solution

Based on the following behavior, we can conclude that slicing a list does not produce a reference to the original list. Rather, slicing a list produces a copy of the appropriate subsequence of the list:

Understanding References: Solutions

Integers are immutable, thus x must reference an entirely new object ( 9 ), and y still references 3 .

Learn Python practically and Get Certified .

Popular Tutorials

Popular examples, reference materials, learn python interactively, python introduction.

  • Get Started With Python
  • Your First Python Program
  • Python Comments

Python Fundamentals

  • Python Variables and Literals
  • Python Type Conversion
  • Python Basic Input and Output
  • Python Operators

Python Flow Control

  • Python if...else Statement
  • Python for Loop
  • Python while Loop
  • Python break and continue
  • Python pass Statement

Python Data types

  • Python Numbers and Mathematics
  • Python List
  • Python Tuple
  • Python String
  • Python Sets
  • Python Dictionary
  • Python Functions
  • Python Function Arguments
  • Python Variable Scope
  • Python Global Keyword
  • Python Recursion
  • Python Modules
  • Python Package
  • Python Main function

Python Files

  • Python Directory and Files Management
  • Python CSV: Read and Write CSV files
  • Reading CSV files in Python
  • Writing CSV files in Python
  • Python Exception Handling
  • Python Exceptions
  • Python Custom Exceptions

Python Object & Class

  • Python Objects and Classes

Python Inheritance

Python Multiple Inheritance

Polymorphism in Python

  • Python Operator Overloading

Python Advanced Topics

  • List comprehension
  • Python Lambda/Anonymous Function
  • Python Iterators
  • Python Generators
  • Python Namespace and Scope
  • Python Closures
  • Python Decorators
  • Python @property decorator
  • Python RegEx

Python Date and Time

  • Python datetime
  • Python strftime()
  • Python strptime()
  • How to get current date and time in Python?
  • Python Get Current Time
  • Python timestamp to datetime and vice-versa
  • Python time Module
  • Python sleep()

Additional Topic

  • Precedence and Associativity of Operators in Python
  • Python Keywords and Identifiers
  • Python Asserts
  • Python Json
  • Python *args and **kwargs

Python Tutorials

Python Classes and Objects

  • Python object()
  • Python super()

Python Object Oriented Programming

Python is a versatile programming language that supports various programming styles, including object-oriented programming (OOP) through the use of objects and classes .

An object is any entity that has attributes and behaviors . For example, a parrot is an object. It has

  • attributes - name, age, color, etc.
  • behavior - dancing, singing, etc.

Similarly, a class is a blueprint for that object.

  • Python Class and Object

In the above example, we created a class with the name Parrot with two attributes: name and age .

Then, we create instances of the Parrot class. Here, parrot1 and parrot2 are references (value) to our new objects.

We then accessed and assigned different values to the instance attributes using the objects name and the . notation.

To learn more about classes and objects, visit Python Classes and Objects

Inheritance is a way of creating a new class for using details of an existing class without modifying it.

The newly formed class is a derived class (or child class). Similarly, the existing class is a base class (or parent class).

Example 2: Use of Inheritance in Python

Here, dog1 (the object of derived class Dog ) can access members of the base class Animal. It's because Dog is inherited from Animal .

To learn more about inheritance, visit Python Inheritance .

  • Python Encapsulation

Encapsulation is one of the key features of object-oriented programming. Encapsulation refers to the bundling of attributes and methods inside a single class.

It prevents outer classes from accessing and changing attributes and methods of a class. This also helps to achieve data hiding .

In Python, we denote private attributes using underscore as the prefix i.e single _ or double __ . For example,

In the above program, we defined a Computer class.

We used __init__() method to store the maximum selling price of Computer . Here, notice the code

Here, we have tried to modify the value of __maxprice outside of the class. However, since __maxprice is a private variable, this modification is not seen on the output.

As shown, to change the value, we have to use a setter function i.e setMaxPrice() which takes price as a parameter.

  • Polymorphism

Polymorphism is another important concept of object-oriented programming. It simply means more than one form.

That is, the same entity (method or operator or object) can perform different operations in different scenarios.

Let's see an example,

In the above example, we have created a superclass: Polygon and two subclasses: Square and Circle . Notice the use of the render() method.

The main purpose of the render() method is to render the shape. However, the process of rendering a square is different from the process of rendering a circle.

Hence, the render() method behaves differently in different classes. Or, we can say render() is polymorphic.

To learn more about polymorphism, visit Polymorphism in Python .

  • Key Points to Remember:
  • Object-Oriented Programming makes the program easy to understand as well as efficient.
  • Since the class is sharable, the code can be reused.
  • Data is safe and secure with data abstraction.
  • Polymorphism allows the same interface for different objects, so programmers can write efficient code.
  • self in Python, Demystified

Table of Contents

  • Introduction

Video: Object-oriented Programming in Python

Sorry about that.

Related Tutorials

Python Tutorial

Python Operators Cheat Sheet

Author's photo

  • python basics
  • learn python

Discover the essential Python operators and how to effectively use them with our comprehensive cheat sheet. We cover everything from arithmetic to bitwise operations!

If you’ve ever written a few lines of Python code, you are likely familiar with Python operators. Whether you're doing basic arithmetic calculations, creating variables, or performing complex logical operations, chances are that you had to use a Python operator to perform the task. But just how many of them exist, and what do you use them for?

In this cheat sheet, we will cover every one of Python’s operators:

  • Arithmetic operators.
  • Assignment operators.
  • Comparison operators.
  • Logical operators.
  • Identity operators.
  • Membership operators.
  • Bitwise operators.

Additionally, we will discuss operator precedence and its significance in Python.

If you're just starting out with Python programming, you may want to look into our Python Basics Track . Its nearly 40 hours of content covers Python operators and much more; you’ll get an excellent foundation to build your coding future on.

Without further ado, let's dive in and learn all about Python operators.

What Are Python Operators?

Python operators are special symbols or keywords used to perform specific operations. Depending on the operator, we can perform arithmetic calculations, assign values to variables, compare two or more values, use logical decision-making in our programs, and more.

How Operators Work

Operators are fundamental to Python programming (and programming as a whole); they allow us to manipulate data and control the flow of our code. Understanding how to use operators effectively enables programmers to write code that accomplishes a desired task.

In more specific terms, an operator takes two elements – called operands – and combines them in a given manner. The specific way that this combination happens is what defines the operator. For example, the operation A + B takes the operands A and B , performs the “sum” operation (denoted by the + operator), and returns the total of those two operands.

The Complete List of Python Operators

Now that we know the basic theory behind Python operators, it’s time to go over every single one of them.

In each section below, we will explain a family of operators, provide a few code samples on how they are used, and present a comprehensive table of all operators in that family. Let’s get started!

Python Arithmetic Operators

Arithmetic operators are used to perform mathematical calculations like addition, subtraction, multiplication, division, exponentiation, and modulus. Most arithmetic operators look the same as those used in everyday mathematics (or in spreadsheet formulas).

Here is the complete list of arithmetic operators in Python:

Most of these operators are self-explanatory, but a few are somewhat tricky. The floor division operator ( // ), for example, returns the integer portion of the division between two numbers.

The modulo operator ( % ) is also uncommon: it returns the remainder of an integer division, i.e. what remains when you divide a number by another. When dividing 11 by 4, the number 4 divides “perfectly” up to the value 8. This means that there’s a remainder of 3 left, which is the value returned by the modulo operator.

Also note that the addition ( + ) and subtraction ( - ) operators are special in that they can operate on a single operand; the expression +5 or -5 is considered an operation in itself. When used in this fashion, these operators are referred to as unary operators . The negative unary operator (as in -5 ) is used to invert the value of a number, while the positive unary operator (as in +5 ) was mostly created for symmetrical reasons, since writing +5 is effectively the same as just writing 5 .

Python Assignment Operators

Assignment operators are used to assign values to variables . They can also perform arithmetic operations in combination with assignments.

The canonical assignment operator is the equal sign ( = ). Its purpose is to bind a value to a variable: if we write x = 10 , we store the value 10 inside the variable x. We can then later refer to the variable x in order to retrieve its value.

The remaining assignment operators are collectively known as augmented assignment operators . They combine a regular assignment with an arithmetic operator in a single line. This is denoted by the arithmetic operator placed directly before the “vanilla” assignment operator.

Augmented assignment operators are simply used as a shortcut. Instead of writing x = x + 1 , they allow us to write x += 1 , effectively “updating” a variable in a concise manner. Here’s a code sample of how this works:

In the table below, you can find the complete list of assignment operators in Python. Note how there is an augmented assignment operator for every arithmetic operator we went over in the previous section:

Python Comparison Operators

Comparison operators are used to compare two values . They return a Boolean value ( True or False ) based on the comparison result.

These operators are often used in conjunction with if/else statements in order to control the flow of a program. For example, the code block below allows the user to select an option from a menu:

The table below shows the full list of Python comparison operators:

Note: Pay attention to the “equal to” operator ( == ) – it’s easy to mistake it for the assignment operator ( = ) when writing Python scripts!

If you’re coming from other programming languages, you may have heard about “ternary conditional operators”. Python has a very similar structure called conditional expressions, which you can learn more about in our article on ternary operators in Python . And if you want more details on this topic, be sure to check out our article on Python comparison operators .

Python Logical Operators

Logical operators are used to combine and manipulate Boolean values . They return True or False based on the Boolean values given to them.

Logical operators are often used to combine different conditions into one. You can leverage the fact that they are written as normal English words to create code that is very readable. Even someone who isn’t familiar with Python could roughly understand what the code below attempts to do:

Here is the table with every logical operator in Python:

Note: When determining if a value falls inside a range of numbers, you can use the “interval notation” commonly used in mathematics; the expression x > 0 and x < 100 can be rewritten as 0 < x < 100 .

Python Identity Operators

Identity operators are used to query whether two Python objects are the exact same object . This is different from using the “equal to” operator ( == ) because two variables may be equal to each other , but at the same time not be the same object .

For example, the lists list_a and list_b below contain the same values, so for all practical purposes they are considered equal. But they are not the same object – modifying one list does not change the other:

The table below presents the two existing Python identity operators:

Python Membership Operators

Membership operators are used to test if a value is contained inside another object .

Objects that can contain other values in them are known as collections . Common collections in Python include lists, tuples, and sets.

Python Bitwise Operators

Bitwise operators in Python are the most esoteric of them all. They are used to perform bit-level operations on integers. Although you may not use these operators as often in your day to day coding, they are a staple in low-level programming languages like C.

As an example, let’s consider the numbers 5 (whose binary representation is 101 ), and the number 3 (represented as 011 in binary).

In order to apply the bitwise AND operator ( & ), we take the first digit from each number’s binary representation (in this case: 1 for the number 5, and 0 for the number 3). Then, we perform the AND operation, which works much like Python’s logical and operator except True is now 1 and False is 0 .

This gives us the operation 1 AND 0 , which results in 0 .

We then simply perform the same operation for each remaining pair of digits in the binary representation of 5 and 3, namely:

  • 0 AND 1 = 0
  • 1 AND 1 = 1

We end up with 0 , 0 , and 1 , which is then put back together as the binary number 001 – which is, in turn, how the number 1 is represented in binary. This all means that the bitwise operation 5 & 3 results in 1 . What a ride!

The name “bitwise” comes from the idea that these operations are performed on “bits” (the numbers 0 or 1), one pair at a time. Afterwards, they are all brought up together in a resulting binary value.

The table below presents all existing bitwise operations in Python:

Operator Precedence in Python

Operator precedence determines the order in which operators are evaluated in an expression. Operators with higher precedence are evaluated first.

For example, the fact that the exponentiation operator ( ** ) has a higher precedence than the addition operator ( + ) means that the expression 2 ** 3 + 4 is seen by Python as (2 ** 3) + 4 . The order of operation is exponentiation and then addition. To override operator precedence, you need to explicitly use parentheses to encapsulate a part of the expression, i.e. 2 ** (3 + 4) .

The table below illustrates the operator precedence in Python. Operators in the earlier rows have a higher precedence:

Want to Learn More About Python Operators?

In this article, we've covered every single Python operator. This includes arithmetic, assignment, comparison, logical, identity, membership, and bitwise operators. Understanding these operators is crucial for writing Python code effectively!

For those looking to dive deeper into Python, consider exploring our Learn Programming with Python track . It consists of five in-depth courses and over 400 exercises for you to master the language. You can also challenge yourself with our article on 10 Python practice exercises for beginners !

You may also like

python assignment of object

How Do You Write a SELECT Statement in SQL?

python assignment of object

What Is a Foreign Key in SQL?

python assignment of object

Enumerate and Explain All the Basic Elements of an SQL Query

  • Python Basics
  • Interview Questions
  • Python Quiz
  • Popular Packages
  • Python Projects
  • Practice Python
  • AI With Python
  • Learn Python3
  • Python Automation
  • Python Web Dev
  • DSA with Python
  • Python OOPs
  • Dictionaries
  • How to Learn Python in 21 Days?
  • 7 Best Python Frameworks to Learn in 2024
  • 10 reasons to learn Python in 2019
  • Why You Should Learn Python in 2021?
  • Is it Worth to Learn Python in 2020?
  • Top 10 Python Libraries for Data Science in 2024
  • Top 10 Python Packages to Learn in 2024
  • How To Make a Subclass from a Super Class In Python
  • 7 Reasons Why You Should Learn Python in 2022
  • How Much Python Should You know To Learn Django?
  • How to create modules in Python 3 ?
  • How to Install Scikit-Learn on Linux?
  • Python Cheat sheet (2023)
  • Run python script from anywhere in linux
  • How to Start Learning Machine Learning?
  • How to Install Pandas in Python?
  • 12 Reasons Why You Should Learn Python (2024)
  • How to use the Live Coding Feature of Python in Eclipse?
  • Top 20 Python Libraries To Know in 2024

How to Learn Python from Scratch in 2024

Python is a general-purpose high-level programming language and is widely used among the developers’ community. Python was mainly developed for emphasis on code readability, and its syntax allows programmers to express concepts in fewer lines of code.

Learn Python from Scratch

If you are new to programming and want to learn Python Programming from Scratch, then this complete 2024 guide is here to help you. Whether you are an experienced programmer or new to the programming world, this guide will help you with the knowledge and resources needed to get started with Python Language.

Key features of Python

Python  has many reasons for being popular and in demand. A few of the reasons are mentioned below.

  • Emphasis on  code readability, shorter codes, ease of writing .
  • Programmers can express logical concepts intarted with Pyth  fewer lines of code  in comparison to languages such as C++ or Java.
  • Python  supports multiple programming paradigms , like object-oriented, imperative and functional programming or procedural.
  • It provides  extensive support libraries (Django for web development, Pandas for data analytics etc)
  • Dynamically typed language (Data type is based on value assigned)
  • Philosophy is “Simplicity is the best”.

Application Areas

python-applications

Getting started with Python Programming –

Python is a lot easier to code and learn. Python programs can be written on any plain text editor like notepad, notepad++, or anything of that sort. One can also use an  online IDE for writing Python codes  or can even install one on their system to make it more feasible to write these codes because IDEs provide a lot of features like intuitive code editor, debugger, compiler, etc. To begin with, writing Python Codes and performing various intriguing and useful operations, one must have Python installed on their System. This can be done by following the step by step instructions provided below:

What if Python already exists? Let’s check

Windows don’t come with Python preinstalled, it needs to be installed explicitly. But unlike windows, most of the Linux OS have Python pre-installed, also macOS comes with Python pre-installed. To check if your device is pre-installed with Python or not, just go to  Command Line (For  Windows , search for  cmd  in the Run dialog( +  R ), for  Linux  open the terminal using  Ctrl+Alt+T , for  macOS  use control+Option+Shift+T .

Now run the following command:

For Python2

For Python3

If Python is already installed, it will generate a message with the Python version available.

learn python

Download and Installation

Before starting with the installation process, you need to download it. For that all versions of Python for Windows, Linux, and MacOS are available on  python.org .

How-to-install-Python-for-windows-11

Download the Python and follow the further instructions for the installation of Python.

Beginning the installation.

python-install-windows-1

How to run a Python program

Let’s consider a simple Hello World Program.

Generally, there are two ways to run a Python program.

  • Using IDEs:  You can use various IDEs(Pycharm, Jupyter Notebook, etc.) which can be used to run Python programs.
  • Using Command-Line:  You can also use command line options to run a Python program. Below steps demonstrate how to run a Python program on Command line in Windows/Unix Operating System:

Open Commandline and then to compile the code type  python HelloWorld.py . If your code has no error then it will execute properly and output will be displayed.

python-hellow-world-windows

Open Terminal of your Unix/Linux OS and then to compile the code type  python HelloWorld.py . If your code has no error then it will execute properly and output will be displayed.

python-linux-hello-world

Fundamentals of Python

Python indentation.

Python uses  indentation  to highlight the blocks of code. Whitespace is used for  indentation  in Python. All statements with the same distance to the right belong to the same block of code. If a block has to be more deeply nested, it is simply indented further to the right. You can understand it better by looking at the following lines of code.

The lines  print(‘Logging on to geeksforgeeks…’)  and  print(‘retype the URL.’)  are two separate code blocks. The two blocks of code in our example if-statement are both indented four spaces. The final  print(‘All set!’)  is not indented, and so it does not belong to the else-block.

Note:  For more information, refer   Indentation in Python .

Python Comments

Comments  are useful information that the developers provide to make the reader understand the source code. It explains the logic or a part of it used in the code. There are two types of comment in Python:

Single line comments:  Python single line comment starts with hashtag symbol with no white spaces.

Multi-line string as comment:  Python multi-line comment is a piece of text enclosed in a delimiter (“””) on each end of the comment.

Note:  For more information, refer   Comments in Python .

Variables  in Python are not “statically typed”. We do not need to declare variables before using them or declare their type. A variable is created the moment we first assign a value to it.

Note:  For more information, refer   Python Variables .

Operators  are the main building block of any programming language. Operators allow the programmer to perform different kinds of operations on operands. These operators can be categorized based upon their different functionality:

Arithmetic operators : Arithmetic operators are used to perform mathematical operations like addition, subtraction, multiplication and division.

Relational Operators:  Relational operators compares the values. It either returns True or False according to the condition.

Logical Operators:  Logical operators perform Logical AND, Logical OR and Logical NOT operations.

Bitwise operators:  Bitwise operator acts on bits and performs bit by bit operation.

Assignment operators: Assignment operators are used to assign values to the variables.

Special operators:  Special operators are of two types-

  • Identity operator that contains  is  and  is not .
  • Membership operator that contains  in  and  not in .

Note:  For more information, refer   Basic Operators in Python .

Basics of Input/Output

Taking input from user –.

Python provides us with two inbuilt functions to read the input from the keyboard.

  • raw_input():  This function works in older version (like Python 2.x). This function takes exactly what is typed from the keyboard, convert it to string and then return it to the variable in which we want to store. For example:
  • input():  This function first takes the input from the user and then evaluates the expression, which means Python automatically identifies whether the user entered a string or a number or list. For example:

Note:  For more information, refer   Python  input()  and  raw_input() .

Printing output to console –

The simplest way to produce output is using the  print()  function where you can pass zero or more expressions separated by commas. This function converts the expressions you pass into a string before writing to the screen.

Data types  are the classification or categorization of data items. It represents the kind of value that tells what operations can be performed on a particular data. Since everything is an object in Python programming, data types are actually classes and variables are instance (object) of these classes.

Python-data-structure

In Python, numeric data type represent the data which has numeric value. Numeric value can be interger, floating number or even complex numbers. These values are defined as  int ,  float  and  complex  class in Python.

Sequence Type

In Python, a sequence is the ordered collection of similar or different data types. Sequences allow storing multiple values in an organized and efficient fashion. There are several sequence types in Python –

1) String:  A string is a collection of one or more characters put in a single quote, double-quote or triple quote. In python there is no character data type, a character is a string of length one. It is represented by  str  class. Strings in Python can be created using single quotes or double quotes or even triple quotes.

Accessing elements of string –

strings

Deleting/Updating from a String –

In Python, Updation or deletion of characters from a String is not allowed because Strings are immutable. Only new strings can be reassigned to the same name.

Note:  For more information, refer   Python String .

Refer to the below articles to know more about Strings: String Slicing in Python Python String Concatenation Python String Interpolation Python programming questions on String

2) List:   Lists  are just like the arrays, declared in other languages. A single list may contain DataTypes like Integers, Strings, as well as Objects. The elements in a list are indexed according to a definite sequence and the indexing of a list is done with 0 being the first index. It is represented by  list  class.

Adding Elements to a List:  Using  append() ,  insert()  and  extend()

Accessing elements from the List –

Use the index operator  [ ]  to access an item in a list. In Python, negative sequence indexes represent positions from the end of the array. Instead of having to compute the offset as in  List[len(List)-3] , it is enough to just write  List[-3] .

Removing Elements from the List:  Using  remove()  and  pop()

Note:  For more information, refer   Python List .

Refer to the below articles to know more about List: Iterate over a list in Python Python List Comprehension and Slicing Python programming questions on List

3) Tuple:   Tuple  is an ordered collection of Python objects much like a list. The important difference between a list and a tuple is that tuples are immutable. It is represented by  tuple  class. In Python, tuples are created by placing a sequence of values separated by ‘comma’ with or without the use of parentheses for grouping of the data sequence.

Accessing element of a tuple –

Use the index operator  [ ]  to access an item in a tuple.

Deleting/updating elements of tuple –

Items of a tuple cannot be deleted as tuples are immutable in Python. Only new tuples can be reassigned to the same name.

Note:  For more information, refer   Python Tuples .

Refer to the below articles to know more about tuples: Unpacking a Tuple in Python Operations on Tuples Python programming questions on Tuples

Booleans are data type with one of the two built-in values,  True  or  False . It is denoted by the class bool.

In Python, Set is an unordered collection of data type that is iterable, mutable and has no duplicate elements. The order of elements in a set is undefined though it may consist of various elements. Sets can be created by using the built-in  set()  function with an iterable object or a sequence by placing the sequence inside curly braces  {} , separated by ‘comma’.

Adding elements:  Using  add()  and  update()

Accessing a Set:  One can loop through the set items using a  for  loop as set items cannot be accessed by referring to an index.

Removing elements from a set:  Using  remove() ,  discard() ,  pop()  and  clear()

Note:  For more information, refer   Python Sets .

Refer to the below articles to know more about Sets: Iterate over a set in Python frozenset() in Python Python programming questions on Sets

Dictionary  in Python is an unordered collection of data values, used to store data values like a map. Dictionary holds  key:value  pair. Each key-value pair in a Dictionary is separated by a colon  : , whereas each key is separated by a ‘comma’. A Dictionary can be created by placing a sequence of elements within curly  {}  braces, separated by ‘comma’.

Nested Dictionary:

Nested-Dictionary

Note:  For more information, refer   Python Nested Dictionary . Adding elements to a Dictionary:  One value at a time can be added to a Dictionary by defining value along with the key e.g.  Dict[Key] = ‘Value’ .

Accessing elements from a Dictionary:  In order to access the items of a dictionary refer to its key name or use  get()  method.

Removing Elements from Dictionary:  Using  pop()  and  popitem()

Note:  For more information, refer   Python Dictionary .

Refer to the below articles to know more about dictionary: Operations on Dictionary Iterate over a dictionary in Python Python programming questions on dictionary

Decision Making

Decision Making in programming is similar to decision making in real life. A programming language uses control statements to control the flow of execution of the program based on certain conditions. These are used to cause the flow of execution to advance and branch based on changes to the state of a program.

Decision-making statements in Python

  • if statement
  • if..else statements
  • nested if statements
  • if-elif ladder

Example 1:  To demonstrate  if  and  if-else

Example 2:  To demonstrate  nested-if  and  if-elif

Note:  For more information, refer   Decision Making in Python .

Control flow (Loops)

Loops  in programming come into use when we need to repeatedly execute a block of statements. For example: Suppose we want to print “Hello World” 10 times. This can be done with the help of loops. The loops in Python are:

while-loop

Output: Hello Geek Hello Geek Hello Geek 4 3 2 1 11 Note:  For more information, refer   Python While Loops .

for-loop-python

Output: List Iteration geeks for geeks String Iteration G e e k s For-else loop G e e k s No Break G Note:  For more information, refer   Python For Loops .

PythonRange

Output: 0 1 2 3 4 2 3 4 5 6 7 8 15 18 21 24 Note:  For more information, refer   Python range() function .

Refer to the below articles to know more about Loops: Understanding for-loop in Python Backward iteration in Python

Loop control statements

Loop control statements  change execution from its normal sequence. Following are the loop control statements provided by Python:

  • Break:  Break statement in Python is used to bring the control out of the loop when some external condition is triggered.
  • Continue:  Continue statement is opposite to that of break statement, instead of terminating the loop, it forces to execute the next iteration of the loop.
  • Pass:  Pass statement is used to write empty loops. Pass is also used for empty control statement, function and classes.

Note:  For more information, refer   break, continue and pass in Python .

Functions  are generally the block of codes or statements in a program that gives the user the ability to reuse the same code which ultimately saves the excessive use of memory, acts as a time saver and more importantly, provides better readability of the code. So basically, a function is a collection of statements that perform some specific task and return the result to the caller. A function can also perform some specific task without returning anything. In Python,  def  keyword is used to create functions.

Function with arguments

  • Default arguments:  A default argument is a parameter that assumes a default value if a value is not provided in the function call for that argument.

Output: ('x: ', 10) ('y: ', 50)

  • Keyword arguments:  The idea is to allow caller to specify argument name with values so that caller does not need to remember order of parameters.

Output: ('Geeks', 'Practice') ('Geeks', 'Practice')

  • Variable length arguments:  In Python a function can also have variable number of arguments. This can be used in the case when we do not know in advance the number of arguments that will be passed into a function.

Output: Hello Welcome to GeeksforGeeks first == Geeks last == Geeks mid == for

Note:  For more information, refer   Functions in Python .

Refer to the below articles to know more about functions: Python Inner Functions Python return statement Call function from another function

Lambda functions

In Python, the  lambda/anonymous  function means that a function is without a name. The  lambda  keyword is used to create anonymous functions. Lambda function can have any number of arguments but has only one expression.

Note:  For more information, refer   Python lambda (Anonymous Functions) .

Refer to the below articles to know more about Lambda: Python programming questions on Lambda

Object Oriented Programming

Object-oriented programming aims to implement real-world entities like inheritance, hiding, polymorphism, etc in programming. The main aim of OOP is to bind together the data and the functions that operate on them so that no other part of the code can access this data except that function.

Python-OOPS-Concept

Classes and Objects

Class  creates a user-defined data structure, which holds its own data members and member functions, which can be accessed and used by creating an instance of that class. A class is like a blueprint for an object.

An  Object  is an instance of a Class. A class is like a blueprint while an instance is a copy of the class with actual values.

Note:  For more information, refer   Python Classes and Objects .

self  represents the instance of the class. By using the “ self ” keyword we can access the attributes and methods of the class in python. It binds the attributes with the given arguments.

Note:  For more information, refer   self in Python class .

Constructors and Destructors

Constructors:  Constructors are generally used for instantiating an object.The task of constructors is to initialize(assign values) to the data members of the class when an object of class is created. In Python the  __init__()  method is called the constructor and is always called when an object is created. There can be two types of constructors:

  • Default constructor:  The constructor which is called implicilty and do not accept any argument.
  • Parameterized constructor: Constructor which is called explicitly with parameters is known as parameterized constructor.

Note:  For more information, refer   Constructors in Python .

Destructors:  Destructors are called when an object gets destroyed. The  __del__()  method is a known as a destructor method in Python. It is called when all references to the object have been deleted i.e when an object is garbage collected.

Note:  For more information, refer   Destructors in Python .

Inheritance

Inheritance is the ability of any class to extract and use features of other classes. It is the process by which new classes called the derived classes are created from existing classes called Base classes.

Note:  For more information, refer   Python inheritance .

Encapsulation

Encapsulation  describes the idea of wrapping data and the methods that work on data within one unit. This puts restrictions on accessing variables and methods directly and can prevent the accidental modification of data.

Note:  For more information, refer   Encapsulation in Python .

Polymorphism

Polymorphism  refers to the ability of OOPs programming languages to differentiate between entities with the same name efficiently. This is done by Python with the help of the signature of these entities.

Refer to the articles to know more about OOPS: Bound, unbound, and static methods in Python Multiple inheritance in Python __new__ in Python

File Handling

File handling  is the ability of Python to handle files i.e. to read and write files along with many other file handling options. Python treats files differently as text or binary and this is important. Each line of code includes a sequence of characters and they form a text file. Each line of a file is terminated with a special character, called the  EOL or End of Line characters  like comma  {, }  or newline character.

Basic File Handling operations in Python are:

1) Open a file:  Opening a file refers to getting the file ready either for reading or for writing. This can be done using the  open()  function. This function returns a file object and takes two arguments, one that accepts the file name and another that accepts the mode(Access Mode). Python provides six Access Modes:

Note:  For more information, refer   Open a File in Python .

2) Close the file:   close()  function closes the file and frees the memory space acquired by that file.

3) Reading from a File:  There are three ways to read data from a text file.

  • read():  Returns the read bytes in form of a string. Reads n bytes, if no n specified, reads the entire file. File_object.read([n])
  • readline():  Reads a line of the file and returns in form of a string.For specified n, reads at most n bytes. However, does not reads more than one line, even if n exceeds the length of the line. File_object.readline([n])
  • readlines():  Reads all the lines and return them as each line a string element in a list. File_object.readlines()

Let’s suppose the file looks like this:

python-file-handling

Note:  For more information, refer   How to read from a file in Python .

4) Writing to a file:  There are two ways to write in a file.

  • write():  Inserts the string str1 in a single line in the text file. File_object.write(str1)
  • writelines():  For a list of string elements, each string is inserted in the text file. Used to insert multiple strings at a single time. File_object.writelines(L) for L = [str1, str2, str3]

python-writing-to-file

Note:  For more information, refer   Writing to file in Python .

Refer to the below articles to know more about File-Handling: Python seek() function Python tell() function OS Module in Python Programs on OS module

Modules and Packages

A module is a self-contained Python file that contains Python statements and definitions, like a file named  GFG.py , which can be considered as a module named  GFG  which can be imported with the help of  import statement .

Let’s create a simple module named GFG.

To use the above created module, create a new Python file in the same directory and import GFG module using the  import  statement.

Note:  For more information, refer   Python Modules .

Packages are a way of structuring many packages and modules which helps in a well-organized hierarchy of data set, making the directories and modules easy to access.

To create a package in Python, we need to follow these three simple steps:

  • First, we create a directory and give it a package name, preferably related to its operation.
  • Then we put the classes and the required functions in it.
  • Finally we create an  __init__.py  file inside the directory, to let Python know that the directory is a package.

Example:  Let’s create a package for cars.

  • First we create a directory and name it Cars.
  • Finally we create the __init__.py file. This file will be placed inside the Cars directory and can be left blank.

Now, let’s use the package that we created. To do this make a sample.py file in the same directory where Cars package is located and add the following code to it:

python-packages1

Note:  For more information, refer   Create and Access a Python Package .

Regular expressions(RegEx)

Python RegEx  is a powerful text matching tool that uses a pre-defined pattern to match the text. It can identify the presence or absence of text by comparing it to a specific pattern, and it can also divide a pattern into one or more sub-patterns. Below is the list of metacharacters:

The most frequently used methods are:

re.findall():  Return all non-overlapping matches of pattern in string, as a list of strings. The string is scanned left-to-right, and matches are returned in the order found.

Output: ['123456789', '987654321'] In the above example, metacharacter blackslash  ‘\’  has a very important role as it signals various sequences. If the blackslash is to be used without its special meaning as metacharacter, use ’\\’ .<> \d Matches any decimal digit, this is equivalent to the set class [0-9]. \D Matches any non-digit character. \s Matches any whitespace character. \S Matches any non-whitespace character \w Matches any alphanumeric character, this is equivalent to the class [a-zA-Z0-9_]. \W Matches any non-alphanumeric character.

re.compile():  Regular expressions are compiled into pattern objects, which have methods for various operations such as searching for pattern matches or performing string substitutions.

Output: ['e', 'a', 'd', 'b', 'e', 'a']

re.match():  This function attempts to match pattern to whole string. The re.match function returns a match object on success, None on failure.

Output: Given Data: Jun 24 Month: Jun Day: 24 Not a valid date

re.search():  This method either returns None (if the pattern doesn’t match), or a re.MatchObject that contains information about the matching part of the string.

Output: Match at index 14, 21 Full match: June 24 Month: June Day: 24

Note:  For more information, refer   Regular Expression in Python .

Exception handling

Like other languages, Python also provides the runtime errors via  exception handling  method with the help of  try-except .

How try-except works?

  • First try clause is executed i.e. the code between try and except clause.
  • If there is no exception, then only try clause will run, except clause is finished.
  • If any exception occurred, try clause will be skipped and except clause will run.
  • If any exception occurs, but the except clause within the code doesn’t handle it, it is passed on to the outer try statements. If the exception left unhandled, then the execution stops.
  • A try statement can have more than one except clause.

Code 1:  No exception, so try clause will run.

Code 2:  There is an exception so only except clause will run.

Else Clause:  In python, you can also use else clause on try-except block which must be present after all the except clauses. The code enters the else block only if the try clause does not raise an exception.

Raising Exception:  The raise statement allows the programmer to force a specific exception to occur. This must be either an exception instance or an exception class. To know more about the list of exception class   click here .

Note:  For more information, refer   Python exception handling .

author

Please Login to comment...

Similar reads, improve your coding skills with practice.

 alt=

What kind of Experience do you want to share?

Do assignments ever require locking?

I recently came across some code where the author applies locks around “simple” assignments, in a multithreaded program:

I.e. the lock merely protects reading and writing the member variable.

Is there any situation, maybe in pypy or some other non-CPython implementation of Python, where the above code might be required to avoid a race condition?

The author of the code in question doesn’t want to remove the lock because they think it might be necessary on Jython or pypy or a future no-GIL CPython or [unknown].

My take is that assignments are atomic by definition, no matter the underlying Python implementation, and the lock is unnecessary overhead and impedes the code’s readability.

Who is correct?

I’d agree with you for reading a primitive.

In the code example, without the lock multiple threads could write to that method variable. And presumably it’s not about reading that method variable (like a primitive). It’s called call_back so the intention is to call it. This could do anything to other state on obj, and require other expensive or shared resources.

So the author could well have had good reason. If nothing’s broken, I would not mess around with it just to improve code quality.

My understanding is that assignments are not by definition atomic - that they are only atomic for simple assignments (using immutable objects like small integers or using built-in data types). Assignments for mutable types/complex objects correspond to multiple byte code instructions. My understanding that a thread switch can occur between any two byte code instructions.

I tried to find a good reference in the official Python docs. Best I could find was this: What kind of global mutation are thread-safe? which is rather fuzzy.

I’m not sure, but I’m tempted to think the sample code does require locking (if thread-safety is a goal). The lock on the read could in some cases also be required, I think. Perhaps not in this example (I dont know), what if you have a longer block of code where the function would be called multiple times and you want to ensure consistency? Also, ‘some_callback’ itself would make me nervous, since it can be anything – for instance a C-level call that itself releases the GIL; it could by itself be thread-safe, but once it releases the GIL anyone is free to modify the parent object.

Unfortunately, without being completely sure what the object is, we can’t actually say. If some_callback is actually a property, it could do anything (as it’s effectively a method call in disguise). Personally I would consider this to be bad style (if it’s a property and it absolutely needs atomicity, it should do the locking inside the property function instead), but it’s legal.

But my gut feeling is that this is cargo cult programming. Having run into threading problems and solved them with locks, the author threw them into more places. It’s really hard to be completely sure, though.

Let’s assume that obj.some_callback is not a property; if it was it could lock itself internally. Likewise if there was an issue with the callback getting run from two threads then it could use an internal lock if it needed to.

My question thus boils down to this: Can “thread A updates an attribute while thread B reads it” result in any other outcome than “thread B reads either the old or the new value of the attribute” plus “there are no related consistency problems” (like broken reference counters)? Or, more to the point, does the specification of Python-the-language, as far as such specification exists, guarantee that anywhere?

No, there is no such formal python specification. However, by default CPython’s behavior is then what should be expected from all implementations, which in this case clearly says “no, pure python code should never be able to result in broken (e.g. wrong ref count) objects”

Starting with the last question: We’re currently (as of 2024) actually seeing quite a bit of specification needing to be written. Aspects that had previously not required any sort of documentation are now going to become important. Free threading is revealing that there are definitely some aspects of Python-the-language that have never actually been promised, and CPython implementation details are what we all go on. So, take all of what I say, and all of what everyone else in this thread says, with the proviso that more things may be specified in the future. I would generally assume that any new specs will be compatible with existing behaviour, though, so anything that IS specified should remain valid.

So. Let’s figure out exactly what happens when you mutate an object’s aftribute. As mentioned, properties and such can get in the way, but I’m going to assume the most simple and straight-forward behaviour there is: The object’s dictionary gets updated.

So your question comes down to two things:

  • Can thread A and thread B see two distinct dictionaries?
  • If one thread is changing a dictionary, will another thread see problems?

I’ll start by excluding a number of behaviours which, if they were to occur, would definitely be called interpreter bugs:

  • A “half-and-half” pointer error. On some CPU architectures, a pointer (such as a Python object reference) can’t be written in one go, so you have to write one half, then the other half. So you could read the first half of the new value paired with the second half of the old value, which would give you a nonsense pointer. This would be bad, very very bad; but it would also be one of the most obvious problems to look for. I think we can rule this one out on the basis that the exact same problem will show up in practically everything, and so it will NEED to be solved. (Which is quite easy on those CPU architectures that can write an entire pointer atomically.)
  • A broken reference count. This one’s specific to reference counting, obviously, and one way to prevent it is to go for a different style of garbage collection (Python doesn’t mandate refcounting). But, again, if refcounting is a thing, broken refcounts are a critical failure, so this one will be dealt with.
  • A failure within the dictionary itself. For example, thread A might be trying to add a new attribute, which causes the dictionary to enlarge itself. This would be a more insidious bug as it’s not going to trigger nearly as frequently as the other types, but since dictionaries are so important in Python, I would trust that people smarter than I will have already looked into this and made sure it won’t be a problem. (Which, again, might be quite simple if there’s a way to leave the old dictionary contents visible to other threads while the new hash table is being constructed.)

In general, anything that would outright segfault the interpreter should be considered a bug. [1] Bugs definitely do happen, but the more common the situation, the more likely that it’ll be discovered early. Core data types like dictionaries, lists, strings, etc should be safe from these kinds of critical failures.

That’s not to say there can’t be other sorts of errors, and a simple x += 1 could well produce strange results, but at very very least, it won’t result in a memory leak or a half-and-half pointer or anything like that.

Unless you’re using ctypes - in which case, have fun, there’s endless crashes waiting for you! ↩︎

The GIL ensures that python will be able to execute its byte code ops atomically. The lock is pointless, unless its a property. As Chris suggest may be cargo-culted.

If there was a read-modify-write pattern then a lock is mandatory for correctness.

If 2 threads read the some_callback then there is nothing to stop the callback being invoken by both threads. Which may, or may not, be intended. More of the design would need be explained.

(This is a decent approximation, but there are exceptions. The GIL isn’t held for “one bytecode operation”; but you can certainly assume that the GIL could be released between any two operations as listed in dis.dis() .)

Umm, well, there are Python versions without a GIL today, not to mention the current work to remove it entirely, long-term.

Related Topics

  • Python »
  • 3.13.0b1 Documentation »
  • What’s New in Python »
  • What’s New In Python 3.13
  • Theme Auto Light Dark |

What’s New In Python 3.13 ¶

Thomas Wouters

This article explains the new features in Python 3.13, compared to 3.12.

For full details, see the changelog .

PEP 719 – Python 3.13 Release Schedule

Prerelease users should be aware that this document is currently in draft form. It will be updated substantially as Python 3.13 moves towards release, so it’s worth checking back even after reading earlier versions.

Summary – Release Highlights ¶

Python 3.13 beta is the pre-release of the next version of the Python programming language, with a mix of changes to the language, the implementation and the standard library. The biggest changes to the implementation include a new interactive interpreter, and experimental support for dropping the Global Interpreter Lock ( PEP 703 ) and a Just-In-Time compiler ( PEP 744 ). The library changes contain removal of deprecated APIs and modules, as well as the usual improvements in user-friendliness and correctness.

Interpreter improvements:

A greatly improved interactive interpreter and improved error messages .

Color support in the new interactive interpreter , as well as in tracebacks and doctest output. This can be disabled through the PYTHON_COLORS and NO_COLOR environment variables.

PEP 744 : A basic JIT compiler was added. It is currently disabled by default (though we may turn it on later). Performance improvements are modest – we expect to be improving this over the next few releases.

PEP 667 : The locals() builtin now has defined semantics when mutating the returned mapping. Python debuggers and similar tools may now more reliably update local variables in optimized frames even during concurrent code execution.

New typing features:

PEP 696 : Type parameters ( typing.TypeVar , typing.ParamSpec , and typing.TypeVarTuple ) now support defaults.

PEP 702 : Support for marking deprecations in the type system using the new warnings.deprecated() decorator.

PEP 742 : typing.TypeIs was added, providing more intuitive type narrowing behavior.

PEP 705 : typing.ReadOnly was added, to mark an item of a typing.TypedDict as read-only for type checkers.

Free-threading:

PEP 703 : CPython 3.13 has experimental support for running with the global interpreter lock disabled when built with --disable-gil . See Free-threaded CPython for more details.

Platform support:

PEP 730 : Apple’s iOS is now an officially supported platform. Official Android support ( PEP 738 ) is in the works as well.

Removed modules:

PEP 594 : The remaining 19 “dead batteries” have been removed from the standard library: aifc , audioop , cgi , cgitb , chunk , crypt , imghdr , mailcap , msilib , nis , nntplib , ossaudiodev , pipes , sndhdr , spwd , sunau , telnetlib , uu and xdrlib .

Also removed were the tkinter.tix and lib2to3 modules, and the 2to3 program.

Release schedule changes:

PEP 602 (“Annual Release Cycle for Python”) has been updated:

Python 3.9 - 3.12 have one and a half years of full support, followed by three and a half years of security fixes.

Python 3.13 and later have two years of full support, followed by three years of security fixes.

New Features ¶

A better interactive interpreter ¶.

On Unix-like systems like Linux or macOS, Python now uses a new interactive shell. When the user starts the REPL from an interactive terminal, and both curses and readline are available, the interactive shell now supports the following new features:

Colorized prompts.

Multiline editing with history preservation.

Interactive help browsing using F1 with a separate command history.

History browsing using F2 that skips output as well as the >>> and … prompts.

“Paste mode” with F3 that makes pasting larger blocks of code easier (press F3 again to return to the regular prompt).

The ability to issue REPL-specific commands like help , exit , and quit without the need to use call parentheses after the command name.

If the new interactive shell is not desired, it can be disabled via the PYTHON_BASIC_REPL environment variable.

For more on interactive mode, see Interactive Mode .

(Contributed by Pablo Galindo Salgado, Łukasz Langa, and Lysandros Nikolaou in gh-111201 based on code from the PyPy project.)

Improved Error Messages ¶

The interpreter now colorizes error messages when displaying tracebacks by default. This feature can be controlled via the new PYTHON_COLORS environment variable as well as the canonical NO_COLOR and FORCE_COLOR environment variables. See also Controlling color . (Contributed by Pablo Galindo Salgado in gh-112730 .)

A common mistake is to write a script with the same name as a standard library module. When this results in errors, we now display a more helpful error message:

Similarly, if a script has the same name as a third-party module it attempts to import, and this results in errors, we also display a more helpful error message:

(Contributed by Shantanu Jain in gh-95754 .)

When an incorrect keyword argument is passed to a function, the error message now potentially suggests the correct keyword argument. (Contributed by Pablo Galindo Salgado and Shantanu Jain in gh-107944 .)

Classes have a new __static_attributes__ attribute, populated by the compiler, with a tuple of names of attributes of this class which are accessed through self.X from any function in its body. (Contributed by Irit Katriel in gh-115775 .)

Defined mutation semantics for locals() ¶

Historically, the expected result of mutating the return value of locals() has been left to individual Python implementations to define.

Through PEP 667 , Python 3.13 standardises the historical behaviour of CPython for most code execution scopes, but changes optimized scopes (functions, generators, coroutines, comprehensions, and generator expressions) to explicitly return independent snapshots of the currently assigned local variables, including locally referenced nonlocal variables captured in closures.

To ensure debuggers and similar tools can reliably update local variables in scopes affected by this change, FrameType.f_locals now returns a write-through proxy to the frame’s local and locally referenced nonlocal variables in these scopes, rather than returning an inconsistently updated shared dict instance with undefined runtime semantics.

See PEP 667 for more details, including related C API changes and deprecations.

(PEP and implementation contributed by Mark Shannon and Tian Gao in gh-74929 . Documentation updates provided by Guido van Rossum and Alyssa Coghlan.)

Incremental Garbage Collection ¶

The cycle garbage collector is now incremental. This means that maximum pause times are reduced by an order of magnitude or more for larger heaps.

Support For Mobile Platforms ¶

iOS is now a PEP 11 supported platform. arm64-apple-ios (iPhone and iPad devices released after 2013) and arm64-apple-ios-simulator (Xcode iOS simulator running on Apple Silicon hardware) are now tier 3 platforms.

x86_64-apple-ios-simulator (Xcode iOS simulator running on older x86_64 hardware) is not a tier 3 supported platform, but will be supported on a best-effort basis.

See PEP 730 : for more details.

(PEP written and implementation contributed by Russell Keith-Magee in gh-114099 .)

Experimental JIT Compiler ¶

When CPython is configured using the --enable-experimental-jit option, a just-in-time compiler is added which may speed up some Python programs.

The internal architecture is roughly as follows.

We start with specialized Tier 1 bytecode . See What’s new in 3.11 for details.

When the Tier 1 bytecode gets hot enough, it gets translated to a new, purely internal Tier 2 IR , a.k.a. micro-ops (“uops”).

The Tier 2 IR uses the same stack-based VM as Tier 1, but the instruction format is better suited to translation to machine code.

We have several optimization passes for Tier 2 IR, which are applied before it is interpreted or translated to machine code.

There is a Tier 2 interpreter, but it is mostly intended for debugging the earlier stages of the optimization pipeline. The Tier 2 interpreter can be enabled by configuring Python with --enable-experimental-jit=interpreter .

When the JIT is enabled, the optimized Tier 2 IR is translated to machine code, which is then executed.

The machine code translation process uses a technique called copy-and-patch . It has no runtime dependencies, but there is a new build-time dependency on LLVM.

The --enable-experimental-jit flag has the following optional values:

no (default) – Disable the entire Tier 2 and JIT pipeline.

yes (default if the flag is present without optional value) – Enable the JIT. To disable the JIT at runtime, pass the environment variable PYTHON_JIT=0 .

yes-off – Build the JIT but disable it by default. To enable the JIT at runtime, pass the environment variable PYTHON_JIT=1 .

interpreter – Enable the Tier 2 interpreter but disable the JIT. The interpreter can be disabled by running with PYTHON_JIT=0 .

(On Windows, use PCbuild/build.bat --experimental-jit to enable the JIT or --experimental-jit-interpreter to enable the Tier 2 interpreter.)

See PEP 744 for more details.

(JIT by Brandt Bucher, inspired by a paper by Haoran Xu and Fredrik Kjolstad. Tier 2 IR by Mark Shannon and Guido van Rossum. Tier 2 optimizer by Ken Jin.)

Free-threaded CPython ¶

CPython will run with the global interpreter lock (GIL) disabled when configured using the --disable-gil option at build time. This is an experimental feature and therefore isn’t used by default. Users need to either compile their own interpreter, or install one of the experimental builds that are marked as free-threaded . See PEP 703 “Making the Global Interpreter Lock Optional in CPython” for more detail.

Free-threaded execution allows for full utilization of the available processing power by running threads in parallel on available CPU cores. While not all software will benefit from this automatically, programs designed with threading in mind will run faster on multicore hardware.

Work is still ongoing: expect some bugs and a substantial single-threaded performance hit.

The free-threaded build still supports optionally running with the GIL enabled at runtime using the environment variable PYTHON_GIL or the command line option -X gil .

To check if the current interpreter is configured with --disable-gil , use sysconfig.get_config_var("Py_GIL_DISABLED") . To check if the GIL is actually disabled in the running process, the sys._is_gil_enabled() function can be used.

C-API extension modules need to be built specifically for the free-threaded build. Extensions that support running with the GIL disabled should use the Py_mod_gil slot. Extensions using single-phase init should use PyUnstable_Module_SetGIL() to indicate whether they support running with the GIL disabled. Importing C extensions that don’t use these mechanisms will cause the GIL to be enabled, unless the GIL was explicitly disabled with the PYTHON_GIL environment variable or the -X gil=0 option.

pip 24.1b1 or newer is required to install packages with C extensions in the free-threaded build.

Other Language Changes ¶

Allow the count argument of str.replace() to be a keyword. (Contributed by Hugo van Kemenade in gh-106487 .)

Compiler now strip indents from docstrings. This will reduce the size of bytecode cache (e.g. .pyc file). For example, cache file size for sqlalchemy.orm.session in SQLAlchemy 2.0 is reduced by about 5%. This change will affect tools using docstrings, like doctest . (Contributed by Inada Naoki in gh-81283 .)

The compile() built-in can now accept a new flag, ast.PyCF_OPTIMIZED_AST , which is similar to ast.PyCF_ONLY_AST except that the returned AST is optimized according to the value of the optimize argument. (Contributed by Irit Katriel in gh-108113 ).

multiprocessing , concurrent.futures , compileall : Replace os.cpu_count() with os.process_cpu_count() to select the default number of worker threads and processes. Get the CPU affinity if supported. (Contributed by Victor Stinner in gh-109649 .)

os.path.realpath() now resolves MS-DOS style file names even if the file is not accessible. (Contributed by Moonsik Park in gh-82367 .)

Fixed a bug where a global declaration in an except block is rejected when the global is used in the else block. (Contributed by Irit Katriel in gh-111123 .)

Many functions now emit a warning if a boolean value is passed as a file descriptor argument. This can help catch some errors earlier. (Contributed by Serhiy Storchaka in gh-82626 .)

Added a new environment variable PYTHON_FROZEN_MODULES . It determines whether or not frozen modules are ignored by the import machinery, equivalent of the -X frozen_modules command-line option. (Contributed by Yilei Yang in gh-111374 .)

Add support for the perf profiler working without frame pointers through the new environment variable PYTHON_PERF_JIT_SUPPORT and command-line option -X perf_jit (Contributed by Pablo Galindo in gh-118518 .)

The new PYTHON_HISTORY environment variable can be used to change the location of a .python_history file. (Contributed by Levi Sabah, Zackery Spytz and Hugo van Kemenade in gh-73965 .)

Add PythonFinalizationError exception. This exception derived from RuntimeError is raised when an operation is blocked during the Python finalization .

The following functions now raise PythonFinalizationError, instead of RuntimeError :

_thread.start_new_thread() .

subprocess.Popen .

os.fork() .

os.forkpty() .

(Contributed by Victor Stinner in gh-114570 .)

Added name and mode attributes for compressed and archived file-like objects in modules bz2 , lzma , tarfile and zipfile . (Contributed by Serhiy Storchaka in gh-115961 .)

Allow controlling Expat >=2.6.0 reparse deferral ( CVE-2023-52425 ) by adding five new methods:

xml.etree.ElementTree.XMLParser.flush()

xml.etree.ElementTree.XMLPullParser.flush()

xml.parsers.expat.xmlparser.GetReparseDeferralEnabled()

xml.parsers.expat.xmlparser.SetReparseDeferralEnabled()

xml.sax.expatreader.ExpatParser.flush()

(Contributed by Sebastian Pipping in gh-115623 .)

The ssl.create_default_context() API now includes ssl.VERIFY_X509_PARTIAL_CHAIN and ssl.VERIFY_X509_STRICT in its default flags.

ssl.VERIFY_X509_STRICT may reject pre- RFC 5280 or malformed certificates that the underlying OpenSSL implementation otherwise would accept. While disabling this is not recommended, you can do so using:

(Contributed by William Woodruff in gh-112389 .)

The configparser.ConfigParser now accepts unnamed sections before named ones if configured to do so. (Contributed by Pedro Sousa Lacerda in gh-66449 .)

annotation scope within class scopes can now contain lambdas and comprehensions. Comprehensions that are located within class scopes are not inlined into their parent scope. (Contributed by Jelle Zijlstra in gh-109118 and gh-118160 .)

Classes have a new __firstlineno__ attribute, populated by the compiler, with the line number of the first line of the class definition. (Contributed by Serhiy Storchaka in gh-118465 .)

from __future__ import ... statements are now just normal relative imports if dots are present before the module name. (Contributed by Jeremiah Gabriel Pascual in gh-118216 .)

New Modules ¶

Improved modules ¶.

Add parameter deprecated in methods add_argument() and add_parser() which allows to deprecate command-line options, positional arguments and subcommands. (Contributed by Serhiy Storchaka in gh-83648 .)

Add 'w' type code ( Py_UCS4 ) that can be used for Unicode strings. It can be used instead of 'u' type code, which is deprecated. (Contributed by Inada Naoki in gh-80480 .)

Add clear() method in order to implement MutableSequence . (Contributed by Mike Zimin in gh-114894 .)

The constructors of node types in the ast module are now stricter in the arguments they accept, and have more intuitive behaviour when arguments are omitted.

If an optional field on an AST node is not included as an argument when constructing an instance, the field will now be set to None . Similarly, if a list field is omitted, that field will now be set to an empty list, and if a ast.expr_context field is omitted, it defaults to Load() . (Previously, in all cases, the attribute would be missing on the newly constructed AST node instance.)

If other arguments are omitted, a DeprecationWarning is emitted. This will cause an exception in Python 3.15. Similarly, passing a keyword argument that does not map to a field on the AST node is now deprecated, and will raise an exception in Python 3.15.

These changes do not apply to user-defined subclasses of ast.AST , unless the class opts in to the new behavior by setting the attribute ast.AST._field_types .

(Contributed by Jelle Zijlstra in gh-105858 , gh-117486 , and gh-118851 .)

ast.parse() now accepts an optional argument optimize which is passed on to the compile() built-in. This makes it possible to obtain an optimized AST. (Contributed by Irit Katriel in gh-108113 .)

asyncio.loop.create_unix_server() will now automatically remove the Unix socket when the server is closed. (Contributed by Pierre Ossman in gh-111246 .)

asyncio.DatagramTransport.sendto() will now send zero-length datagrams if called with an empty bytes object. The transport flow control also now accounts for the datagram header when calculating the buffer size. (Contributed by Jamie Phan in gh-115199 .)

Add asyncio.Server.close_clients() and asyncio.Server.abort_clients() methods which allow to more forcefully close an asyncio server. (Contributed by Pierre Ossman in gh-113538 .)

asyncio.as_completed() now returns an object that is both an asynchronous iterator and a plain iterator of awaitables. The awaitables yielded by asynchronous iteration include original task or future objects that were passed in, making it easier to associate results with the tasks being completed. (Contributed by Justin Arthur in gh-77714 .)

When asyncio.TaskGroup.create_task() is called on an inactive asyncio.TaskGroup , the given coroutine will be closed (which prevents a RuntimeWarning about the given coroutine being never awaited). (Contributed by Arthur Tacca and Jason Zhang in gh-115957 .)

Improved behavior of asyncio.TaskGroup when an external cancellation collides with an internal cancellation. For example, when two task groups are nested and both experience an exception in a child task simultaneously, it was possible that the outer task group would hang, because its internal cancellation was swallowed by the inner task group.

In the case where a task group is cancelled externally and also must raise an ExceptionGroup , it will now call the parent task’s cancel() method. This ensures that a asyncio.CancelledError will be raised at the next await , so the cancellation is not lost.

An added benefit of these changes is that task groups now preserve the cancellation count ( asyncio.Task.cancelling() ).

In order to handle some corner cases, asyncio.Task.uncancel() may now reset the undocumented _must_cancel flag when the cancellation count reaches zero.

(Inspired by an issue reported by Arthur Tacca in gh-116720 .)

Add asyncio.Queue.shutdown() (along with asyncio.QueueShutDown ) for queue termination. (Contributed by Laurie Opperman and Yves Duprat in gh-104228 .)

Accept a tuple of separators in asyncio.StreamReader.readuntil() , stopping when one of them is encountered. (Contributed by Bruce Merry in gh-81322 .)

Add base64.z85encode() and base64.z85decode() functions which allow encoding and decoding Z85 data. See Z85 specification for more information. (Contributed by Matan Perelman in gh-75299 .)

Add copy.replace() function which allows to create a modified copy of an object, which is especially useful for immutable objects. It supports named tuples created with the factory function collections.namedtuple() , dataclass instances, various datetime objects, Signature objects, Parameter objects, code object , and any user classes which define the __replace__() method. (Contributed by Serhiy Storchaka in gh-108751 .)

Add dbm.gnu.gdbm.clear() and dbm.ndbm.ndbm.clear() methods that remove all items from the database. (Contributed by Donghee Na in gh-107122 .)

Add new dbm.sqlite3 backend, and make it the default dbm backend. (Contributed by Raymond Hettinger and Erlend E. Aasland in gh-100414 .)

Change the output of dis module functions to show logical labels for jump targets and exception handlers, rather than offsets. The offsets can be added with the new -O command line option or the show_offsets parameter. (Contributed by Irit Katriel in gh-112137 .)

Color is added to the output by default. This can be controlled via the new PYTHON_COLORS environment variable as well as the canonical NO_COLOR and FORCE_COLOR environment variables. See also Controlling color . (Contributed by Hugo van Kemenade in gh-117225 .)

The doctest.DocTestRunner.run() method now counts the number of skipped tests. Add doctest.DocTestRunner.skips and doctest.TestResults.skipped attributes. (Contributed by Victor Stinner in gh-108794 .)

email.utils.getaddresses() and email.utils.parseaddr() now return ('', '') 2-tuples in more situations where invalid email addresses are encountered instead of potentially inaccurate values. Add optional strict parameter to these two functions: use strict=False to get the old behavior, accept malformed inputs. getattr(email.utils, 'supports_strict_parsing', False) can be used to check if the strict parameter is available. (Contributed by Thomas Dwyer and Victor Stinner for gh-102988 to improve the CVE-2023-27043 fix.)

fractions ¶

Formatting for objects of type fractions.Fraction now supports the standard format specification mini-language rules for fill, alignment, sign handling, minimum width and grouping. (Contributed by Mark Dickinson in gh-111320 .)

The cyclic garbage collector is now incremental, which changes the meanings of the results of gc.get_threshold() and gc.set_threshold() as well as gc.get_count() and gc.get_stats() .

gc.get_threshold() returns a three-item tuple for backwards compatibility. The first value is the threshold for young collections, as before; the second value determines the rate at which the old collection is scanned (the default is 10, and higher values mean that the old collection is scanned more slowly). The third value is meaningless and is always zero.

gc.set_threshold() ignores any items after the second.

gc.get_count() and gc.get_stats() return the same format of results as before. The only difference is that instead of the results referring to the young, aging and old generations, the results refer to the young generation and the aging and collecting spaces of the old generation.

In summary, code that attempted to manipulate the behavior of the cycle GC may not work exactly as intended, but it is very unlikely to be harmful. All other code will work just fine.

Add glob.translate() function that converts a path specification with shell-style wildcards to a regular expression. (Contributed by Barney Gale in gh-72904 .)

importlib ¶

Previously deprecated importlib.resources functions are un-deprecated:

is_resource() open_binary() open_text() path() read_binary() read_text()

All now allow for a directory (or tree) of resources, using multiple positional arguments.

For text-reading functions, the encoding and errors must now be given as keyword arguments.

The contents() remains deprecated in favor of the full-featured Traversable API. However, there is now no plan to remove it.

(Contributed by Petr Viktorin in gh-106532 .)

The io.IOBase finalizer now logs the close() method errors with sys.unraisablehook . Previously, errors were ignored silently by default, and only logged in Python Development Mode or on Python built on debug mode . (Contributed by Victor Stinner in gh-62948 .)

ipaddress ¶

Add the ipaddress.IPv4Address.ipv6_mapped property, which returns the IPv4-mapped IPv6 address. (Contributed by Charles Machalow in gh-109466 .)

Fix is_global and is_private behavior in IPv4Address , IPv6Address , IPv4Network and IPv6Network .

itertools ¶

Added a strict option to itertools.batched() . This raises a ValueError if the final batch is shorter than the specified batch size. (Contributed by Raymond Hettinger in gh-113202 .)

Add the allow_code parameter in module functions. Passing allow_code=False prevents serialization and de-serialization of code objects which are incompatible between Python versions. (Contributed by Serhiy Storchaka in gh-113626 .)

A new function fma() for fused multiply-add operations has been added. This function computes x * y + z with only a single round, and so avoids any intermediate loss of precision. It wraps the fma() function provided by C99, and follows the specification of the IEEE 754 “fusedMultiplyAdd” operation for special cases. (Contributed by Mark Dickinson and Victor Stinner in gh-73468 .)

mimetypes ¶

Add the guess_file_type() function which works with file path. Passing file path instead of URL in guess_type() is soft deprecated . (Contributed by Serhiy Storchaka in gh-66543 .)

The mmap.mmap class now has an seekable() method that can be used when a seekable file-like object is required. The seek() method now returns the new absolute position. (Contributed by Donghee Na and Sylvie Liberman in gh-111835 .)

mmap.mmap now has a trackfd parameter on Unix; if it is False , the file descriptor specified by fileno will not be duplicated. (Contributed by Zackery Spytz and Petr Viktorin in gh-78502 .)

mmap.mmap is now protected from crashing on Windows when the mapped memory is inaccessible due to file system errors or access violations. (Contributed by Jannis Weigend in gh-118209 .)

Move opcode.ENABLE_SPECIALIZATION to _opcode.ENABLE_SPECIALIZATION . This field was added in 3.12, it was never documented and is not intended for external usage. (Contributed by Irit Katriel in gh-105481 .)

Removed opcode.is_pseudo , opcode.MIN_PSEUDO_OPCODE and opcode.MAX_PSEUDO_OPCODE , which were added in 3.12, were never documented or exposed through dis , and were not intended to be used externally.

Add os.process_cpu_count() function to get the number of logical CPUs usable by the calling thread of the current process. (Contributed by Victor Stinner in gh-109649 .)

Add a low level interface for Linux’s timer notification file descriptors via os.timerfd_create() , os.timerfd_settime() , os.timerfd_settime_ns() , os.timerfd_gettime() , and os.timerfd_gettime_ns() , os.TFD_NONBLOCK , os.TFD_CLOEXEC , os.TFD_TIMER_ABSTIME , and os.TFD_TIMER_CANCEL_ON_SET (Contributed by Masaru Tsuchiyama in gh-108277 .)

os.cpu_count() and os.process_cpu_count() can be overridden through the new environment variable PYTHON_CPU_COUNT or the new command-line option -X cpu_count . This option is useful for users who need to limit CPU resources of a container system without having to modify the container (application code). (Contributed by Donghee Na in gh-109595 .)

Add support of os.lchmod() and the follow_symlinks argument in os.chmod() on Windows. Note that the default value of follow_symlinks in os.lchmod() is False on Windows. (Contributed by Serhiy Storchaka in gh-59616 .)

Add support of os.fchmod() and a file descriptor in os.chmod() on Windows. (Contributed by Serhiy Storchaka in gh-113191 .)

os.posix_spawn() now accepts env=None , which makes the newly spawned process use the current process environment. (Contributed by Jakub Kulik in gh-113119 .)

os.posix_spawn() gains an os.POSIX_SPAWN_CLOSEFROM attribute for use in file_actions= on platforms that support posix_spawn_file_actions_addclosefrom_np() . (Contributed by Jakub Kulik in gh-113117 .)

os.mkdir() and os.makedirs() on Windows now support passing a mode value of 0o700 to apply access control to the new directory. This implicitly affects tempfile.mkdtemp() and is a mitigation for CVE-2024-4030 . Other values for mode continue to be ignored. (Contributed by Steve Dower in gh-118486 .)

Add os.path.isreserved() to check if a path is reserved on the current system. This function is only available on Windows. (Contributed by Barney Gale in gh-88569 .)

On Windows, os.path.isabs() no longer considers paths starting with exactly one (back)slash to be absolute. (Contributed by Barney Gale and Jon Foster in gh-44626 .)

Add support of dir_fd and follow_symlinks keyword arguments in shutil.chown() . (Contributed by Berker Peksag and Tahia K in gh-62308 )

Add pathlib.UnsupportedOperation , which is raised instead of NotImplementedError when a path operation isn’t supported. (Contributed by Barney Gale in gh-89812 .)

Add pathlib.Path.from_uri() , a new constructor to create a pathlib.Path object from a ‘file’ URI ( file:// ). (Contributed by Barney Gale in gh-107465 .)

Add pathlib.PurePath.full_match() for matching paths with shell-style wildcards, including the recursive wildcard “ ** ”. (Contributed by Barney Gale in gh-73435 .)

Add pathlib.PurePath.parser class attribute that stores the implementation of os.path used for low-level path parsing and joining: either posixpath or ntpath .

Add recurse_symlinks keyword-only argument to pathlib.Path.glob() and rglob() . (Contributed by Barney Gale in gh-77609 .)

Add follow_symlinks keyword-only argument to is_file() , is_dir() , owner() , group() . (Contributed by Barney Gale in gh-105793 , and Kamil Turek in gh-107962 .)

Return files and directories from pathlib.Path.glob() and rglob() when given a pattern that ends with “ ** ”. In earlier versions, only directories were returned. (Contributed by Barney Gale in gh-70303 .)

Add ability to move between chained exceptions during post mortem debugging in pm() using the new exceptions [exc_number] command for Pdb. (Contributed by Matthias Bussonnier in gh-106676 .)

Expressions/statements whose prefix is a pdb command are now correctly identified and executed. (Contributed by Tian Gao in gh-108464 .)

sys.path[0] will no longer be replaced by the directory of the script being debugged when sys.flags.safe_path is set (via the -P command line option or PYTHONSAFEPATH environment variable). (Contributed by Tian Gao and Christian Walther in gh-111762 .)

zipapp is supported as a debugging target. (Contributed by Tian Gao in gh-118501 .)

breakpoint() and pdb.set_trace() now enter the debugger immediately rather than on the next line of code to be executed. This change prevents the debugger from breaking outside of the context when breakpoint() is positioned at the end of the context. (Contributed by Tian Gao in gh-118579 .)

Add queue.Queue.shutdown() (along with queue.ShutDown ) for queue termination. (Contributed by Laurie Opperman and Yves Duprat in gh-104750 .)

Add a command-line interface . (Contributed by Hugo van Kemenade in gh-54321 .)

Rename re.error to re.PatternError for improved clarity. re.error is kept for backward compatibility.

.pth files are now decoded by UTF-8 first, and then by the locale encoding if the UTF-8 decoding fails. (Contributed by Inada Naoki in gh-117802 .)

A ResourceWarning is now emitted if a sqlite3.Connection object is not closed explicitly. (Contributed by Erlend E. Aasland in gh-105539 .)

Add filter keyword-only parameter to sqlite3.Connection.iterdump() for filtering database objects to dump. (Contributed by Mariusz Felisiak in gh-91602 .)

statistics ¶

Add statistics.kde() for kernel density estimation. This makes it possible to estimate a continuous probability density function from a fixed number of discrete samples. Also added statistics.kde_random() for sampling from the estimated probability density function. (Contributed by Raymond Hettinger in gh-115863 .)

subprocess ¶

The subprocess module now uses the os.posix_spawn() function in more situations. Notably in the default case of close_fds=True on more recent versions of platforms including Linux, FreeBSD, and Solaris where the C library provides posix_spawn_file_actions_addclosefrom_np() . On Linux this should perform similar to our existing Linux vfork() based code. A private control knob subprocess._USE_POSIX_SPAWN can be set to False if you need to force subprocess not to ever use os.posix_spawn() . Please report your reason and platform details in the CPython issue tracker if you set this so that we can improve our API selection logic for everyone. (Contributed by Jakub Kulik in gh-113117 .)

Add the sys._is_interned() function to test if the string was interned. This function is not guaranteed to exist in all implementations of Python. (Contributed by Serhiy Storchaka in gh-78573 .)

On Windows, the default mode 0o700 used by tempfile.mkdtemp() now limits access to the new directory due to changes to os.mkdir() . This is a mitigation for CVE-2024-4030 . (Contributed by Steve Dower in gh-118486 .)

On Windows, time.monotonic() now uses the QueryPerformanceCounter() clock to have a resolution better than 1 us, instead of the GetTickCount64() clock which has a resolution of 15.6 ms. (Contributed by Victor Stinner in gh-88494 .)

On Windows, time.time() now uses the GetSystemTimePreciseAsFileTime() clock to have a resolution better than 1 μs, instead of the GetSystemTimeAsFileTime() clock which has a resolution of 15.6 ms. (Contributed by Victor Stinner in gh-63207 .)

Add tkinter widget methods: tk_busy_hold() , tk_busy_configure() , tk_busy_cget() , tk_busy_forget() , tk_busy_current() , and tk_busy_status() . (Contributed by Miguel, klappnase and Serhiy Storchaka in gh-72684 .)

The tkinter widget method wm_attributes() now accepts the attribute name without the minus prefix to get window attributes, e.g. w.wm_attributes('alpha') and allows to specify attributes and values to set as keyword arguments, e.g. w.wm_attributes(alpha=0.5) . Add new optional keyword-only parameter return_python_dict : calling w.wm_attributes(return_python_dict=True) returns the attributes as a dict instead of a tuple. (Contributed by Serhiy Storchaka in gh-43457 .)

Add new optional keyword-only parameter return_ints in the Text.count() method. Passing return_ints=True makes it always returning the single count as an integer instead of a 1-tuple or None . (Contributed by Serhiy Storchaka in gh-97928 .)

Add support of the “vsapi” element type in the element_create() method of tkinter.ttk.Style . (Contributed by Serhiy Storchaka in gh-68166 .)

Add the after_info() method for Tkinter widgets. (Contributed by Cheryl Sabella in gh-77020 .)

Add the PhotoImage method copy_replace() to copy a region from one image to other image, possibly with pixel zooming and/or subsampling. Add from_coords parameter to PhotoImage methods copy() , zoom() and subsample() . Add zoom and subsample parameters to PhotoImage method copy() . (Contributed by Serhiy Storchaka in gh-118225 .)

Add the PhotoImage methods read() to read an image from a file and data() to get the image data. Add background and grayscale parameters to PhotoImage method write() . (Contributed by Serhiy Storchaka in gh-118271 .)

traceback ¶

Add show_group parameter to traceback.TracebackException.format_exception_only() to format the nested exceptions of a BaseExceptionGroup instance, recursively. (Contributed by Irit Katriel in gh-105292 .)

Add the field exc_type_str to TracebackException , which holds a string display of the exc_type . Deprecate the field exc_type which holds the type object itself. Add parameter save_exc_type (default True ) to indicate whether exc_type should be saved. (Contributed by Irit Katriel in gh-112332 .)

SimpleNamespace constructor now allows specifying initial values of attributes as a positional argument which must be a mapping or an iterable of key-value pairs. (Contributed by Serhiy Storchaka in gh-108191 .)

Add typing.get_protocol_members() to return the set of members defining a typing.Protocol . Add typing.is_protocol() to check whether a class is a typing.Protocol . (Contributed by Jelle Zijlstra in gh-104873 .)

Add typing.ReadOnly , a special typing construct to mark an item of a typing.TypedDict as read-only for type checkers. See PEP 705 for more details.

Add typing.NoDefault , a sentinel object used to represent the defaults of some parameters in the typing module. (Contributed by Jelle Zijlstra in gh-116126 .)

unicodedata ¶

The Unicode database has been updated to version 15.1.0. (Contributed by James Gerity in gh-109559 .)

Add support for adding source control management (SCM) ignore files to a virtual environment’s directory. By default, Git is supported. This is implemented as opt-in via the API which can be extended to support other SCMs ( venv.EnvBuilder and venv.create() ), and opt-out via the CLI (using --without-scm-ignore-files ). (Contributed by Brett Cannon in gh-108125 .)

The new warnings.deprecated() decorator provides a way to communicate deprecations to static type checkers and to warn on usage of deprecated classes and functions. A runtime deprecation warning may also be emitted when a decorated function or class is used at runtime. See PEP 702 . (Contributed by Jelle Zijlstra in gh-104003 .)

xml.etree.ElementTree ¶

Add the close() method for the iterator returned by iterparse() for explicit cleaning up. (Contributed by Serhiy Storchaka in gh-69893 .)

zipimport ¶

Gains support for ZIP64 format files. Everybody loves huge code right? (Contributed by Tim Hatch in gh-94146 .)

Optimizations ¶

textwrap.indent() is now ~30% faster than before for large input. (Contributed by Inada Naoki in gh-107369 .)

The subprocess module uses os.posix_spawn() in more situations including the default where close_fds=True on many modern platforms. This should provide a noteworthy performance increase launching processes on FreeBSD and Solaris. See the subprocess section above for details. (Contributed by Jakub Kulik in gh-113117 .)

Several standard library modules have had their import times significantly improved. For example, the import time of the typing module has been reduced by around a third by removing dependencies on re and contextlib . Other modules to enjoy import-time speedups include importlib.metadata , threading , enum , functools and email.utils . (Contributed by Alex Waygood, Shantanu Jain, Adam Turner, Daniel Hollas and others in gh-109653 .)

Removed Modules And APIs ¶

Pep 594: dead batteries (and other module removals) ¶.

PEP 594 removed 19 modules from the standard library, deprecated in Python 3.11:

aifc . (Contributed by Victor Stinner in gh-104773 .)

audioop . (Contributed by Victor Stinner in gh-104773 .)

chunk . (Contributed by Victor Stinner in gh-104773 .)

cgi and cgitb .

cgi.FieldStorage can typically be replaced with urllib.parse.parse_qsl() for GET and HEAD requests, and the email.message module or multipart PyPI project for POST and PUT .

cgi.parse() can be replaced by calling urllib.parse.parse_qs() directly on the desired query string, except for multipart/form-data input, which can be handled as described for cgi.parse_multipart() .

cgi.parse_header() can be replaced with the functionality in the email package, which implements the same MIME RFCs. For example, with email.message.EmailMessage :

cgi.parse_multipart() can be replaced with the functionality in the email package (e.g. email.message.EmailMessage and email.message.Message ) which implements the same MIME RFCs, or with the multipart PyPI project.

(Contributed by Victor Stinner in gh-104773 .)

crypt module and its private _crypt extension. The hashlib module is a potential replacement for certain use cases. Otherwise, the following PyPI projects can be used:

bcrypt : Modern password hashing for your software and your servers.

passlib : Comprehensive password hashing framework supporting over 30 schemes.

argon2-cffi : The secure Argon2 password hashing algorithm.

legacycrypt : ctypes wrapper to the POSIX crypt library call and associated functionality.

crypt_r : Fork of the crypt module, wrapper to the crypt_r(3) library call and associated functionality.

imghdr : use the projects filetype , puremagic , or python-magic instead. (Contributed by Victor Stinner in gh-104773 .)

mailcap . The mimetypes module provides an alternative. (Contributed by Victor Stinner in gh-104773 .)

msilib . (Contributed by Zachary Ware in gh-104773 .)

nis . (Contributed by Victor Stinner in gh-104773 .)

nntplib : the nntplib PyPI project can be used instead. (Contributed by Victor Stinner in gh-104773 .)

ossaudiodev : use the pygame project for audio playback. (Contributed by Victor Stinner in gh-104780 .)

pipes : use the subprocess module instead. (Contributed by Victor Stinner in gh-104773 .)

sndhdr : use the projects filetype , puremagic , or python-magic instead. (Contributed by Victor Stinner in gh-104773 .)

spwd : the python-pam project can be used instead. (Contributed by Victor Stinner in gh-104773 .)

sunau . (Contributed by Victor Stinner in gh-104773 .)

telnetlib , use the projects telnetlib3 ` or :pypi:`Exscript instead. (Contributed by Victor Stinner in gh-104773 .)

uu : the base64 module is a modern alternative. (Contributed by Victor Stinner in gh-104773 .)

xdrlib . (Contributed by Victor Stinner in gh-104773 .)

Remove the 2to3 program and the lib2to3 module, deprecated in Python 3.11. (Contributed by Victor Stinner in gh-104780 .)

Remove the tkinter.tix module, deprecated in Python 3.6. The third-party Tix library which the module wrapped is unmaintained. (Contributed by Zachary Ware in gh-75552 .)

configparser ¶

Remove the undocumented configparser.LegacyInterpolation class, deprecated in the docstring since Python 3.2, and with a deprecation warning since Python 3.11. (Contributed by Hugo van Kemenade in gh-104886 .)

Remove deprecated __getitem__() access for importlib.metadata.EntryPoint objects. (Contributed by Jason R. Coombs in gh-113175 .)

Remove locale.resetlocale() function deprecated in Python 3.11: use locale.setlocale(locale.LC_ALL, "") instead. (Contributed by Victor Stinner in gh-104783 .)

logging : Remove undocumented and untested Logger.warn() and LoggerAdapter.warn() methods and logging.warn() function. Deprecated since Python 3.3, they were aliases to the logging.Logger.warning() method, logging.LoggerAdapter.warning() method and logging.warning() function. (Contributed by Victor Stinner in gh-105376 .)

Remove support for using pathlib.Path objects as context managers. This functionality was deprecated and made a no-op in Python 3.9.

Remove undocumented, never working, and deprecated re.template function and re.TEMPLATE flag (and re.T alias). (Contributed by Serhiy Storchaka and Nikita Sobolev in gh-105687 .)

Remove the turtle.RawTurtle.settiltangle() method, deprecated in docs since Python 3.1 and with a deprecation warning since Python 3.11. (Contributed by Hugo van Kemenade in gh-104876 .)

Namespaces typing.io and typing.re , deprecated in Python 3.8, are now removed. The items in those namespaces can be imported directly from typing . (Contributed by Sebastian Rittau in gh-92871 .)

Remove support for the keyword-argument method of creating typing.TypedDict types, deprecated in Python 3.11. (Contributed by Tomas Roun in gh-104786 .)

Remove the following unittest functions, deprecated in Python 3.11:

unittest.findTestCases()

unittest.makeSuite()

unittest.getTestCaseNames()

Use TestLoader methods instead:

unittest.TestLoader.loadTestsFromModule()

unittest.TestLoader.loadTestsFromTestCase()

unittest.TestLoader.getTestCaseNames()

(Contributed by Hugo van Kemenade in gh-104835 .)

Remove the untested and undocumented unittest.TestProgram.usageExit() method, deprecated in Python 3.11. (Contributed by Hugo van Kemenade in gh-104992 .)

Remove cafile , capath and cadefault parameters of the urllib.request.urlopen() function, deprecated in Python 3.6: pass the context parameter instead. Use ssl.SSLContext.load_cert_chain() to load specific certificates, or let ssl.create_default_context() select the system’s trusted CA certificates for you. (Contributed by Victor Stinner in gh-105382 .)

webbrowser ¶

Remove the untested and undocumented webbrowser MacOSX class, deprecated in Python 3.11. Use the MacOSXOSAScript class (introduced in Python 3.2) instead. (Contributed by Hugo van Kemenade in gh-104804 .)

Remove deprecated webbrowser.MacOSXOSAScript._name attribute. Use webbrowser.MacOSXOSAScript.name attribute instead. (Contributed by Nikita Sobolev in gh-105546 .)

New Deprecations ¶

Removed chained classmethod descriptors (introduced in gh-63272 ). This can no longer be used to wrap other descriptors such as property . The core design of this feature was flawed and caused a number of downstream problems. To “pass-through” a classmethod , consider using the __wrapped__ attribute that was added in Python 3.10. (Contributed by Raymond Hettinger in gh-89519 .)

array : array ’s 'u' format code, deprecated in docs since Python 3.3, emits DeprecationWarning since 3.13 and will be removed in Python 3.16. Use the 'w' format code instead. (Contributed by Hugo van Kemenade in gh-80480 .)

ctypes : Deprecate undocumented ctypes.SetPointerType() and ctypes.ARRAY() functions. Replace ctypes.ARRAY(item_type, size) with item_type * size . (Contributed by Victor Stinner in gh-105733 .)

decimal : Deprecate non-standard format specifier “N” for decimal.Decimal . It was not documented and only supported in the C implementation. (Contributed by Serhiy Storchaka in gh-89902 .)

dis : The dis.HAVE_ARGUMENT separator is deprecated. Check membership in hasarg instead. (Contributed by Irit Katriel in gh-109319 .)

Frame objects : Calling frame.clear() on a suspended frame raises RuntimeError (as has always been the case for an executing frame). (Contributed by Irit Katriel in gh-79932 .)

getopt and optparse modules: They are now soft deprecated : the argparse module should be used for new projects. Previously, the optparse module was already deprecated, its removal was not scheduled, and no warnings was emitted: so there is no change in practice. (Contributed by Victor Stinner in gh-106535 .)

gettext : Emit deprecation warning for non-integer numbers in gettext functions and methods that consider plural forms even if the translation was not found. (Contributed by Serhiy Storchaka in gh-88434 .)

glob : The undocumented glob.glob0() and glob.glob1() functions are deprecated. Use glob.glob() and pass a directory to its root_dir argument instead. (Contributed by Barney Gale in gh-117337 .)

http.server : http.server.CGIHTTPRequestHandler now emits a DeprecationWarning as it will be removed in 3.15. Process-based CGI HTTP servers have been out of favor for a very long time. This code was outdated, unmaintained, and rarely used. It has a high potential for both security and functionality bugs. This includes removal of the --cgi flag to the python -m http.server command line in 3.15.

mimetypes : Passing file path instead of URL in guess_type() is soft deprecated . Use guess_file_type() instead. (Contributed by Serhiy Storchaka in gh-66543 .)

re : Passing optional arguments maxsplit , count and flags in module-level functions re.split() , re.sub() and re.subn() as positional arguments is now deprecated. In future Python versions these parameters will be keyword-only . (Contributed by Serhiy Storchaka in gh-56166 .)

pathlib : pathlib.PurePath.is_reserved() is deprecated and scheduled for removal in Python 3.15. Use os.path.isreserved() to detect reserved paths on Windows.

platform : java_ver() is deprecated and will be removed in 3.15. It was largely untested, had a confusing API, and was only useful for Jython support. (Contributed by Nikita Sobolev in gh-116349 .)

pydoc : Deprecate undocumented pydoc.ispackage() function. (Contributed by Zackery Spytz in gh-64020 .)

sqlite3 : Passing more than one positional argument to sqlite3.connect() and the sqlite3.Connection constructor is deprecated. The remaining parameters will become keyword-only in Python 3.15.

Deprecate passing name, number of arguments, and the callable as keyword arguments for the following sqlite3.Connection APIs:

create_function()

create_aggregate()

Deprecate passing the callback callable by keyword for the following sqlite3.Connection APIs:

set_authorizer()

set_progress_handler()

set_trace_callback()

The affected parameters will become positional-only in Python 3.15.

(Contributed by Erlend E. Aasland in gh-107948 and gh-108278 .)

sys : sys._enablelegacywindowsfsencoding() function. Replace it with the PYTHONLEGACYWINDOWSFSENCODING environment variable. (Contributed by Inada Naoki in gh-73427 .)

tarfile : The undocumented and unused tarfile attribute of tarfile.TarFile is deprecated and scheduled for removal in Python 3.16.

traceback : The field exc_type of traceback.TracebackException is deprecated. Use exc_type_str instead.

Creating a typing.NamedTuple class using keyword arguments to denote the fields ( NT = NamedTuple("NT", x=int, y=int) ) is deprecated, and will be disallowed in Python 3.15. Use the class-based syntax or the functional syntax instead. (Contributed by Alex Waygood in gh-105566 .)

When using the functional syntax to create a typing.NamedTuple class or a typing.TypedDict class, failing to pass a value to the ‘fields’ parameter ( NT = NamedTuple("NT") or TD = TypedDict("TD") ) is deprecated. Passing None to the ‘fields’ parameter ( NT = NamedTuple("NT", None) or TD = TypedDict("TD", None) ) is also deprecated. Both will be disallowed in Python 3.15. To create a NamedTuple class with 0 fields, use class NT(NamedTuple): pass or NT = NamedTuple("NT", []) . To create a TypedDict class with 0 fields, use class TD(TypedDict): pass or TD = TypedDict("TD", {}) . (Contributed by Alex Waygood in gh-105566 and gh-105570 .)

typing.no_type_check_decorator() is deprecated, and scheduled for removal in Python 3.15. After eight years in the typing module, it has yet to be supported by any major type checkers. (Contributed by Alex Waygood in gh-106309 .)

typing.AnyStr is deprecated. In Python 3.16, it will be removed from typing.__all__ , and a DeprecationWarning will be emitted when it is imported or accessed. It will be removed entirely in Python 3.18. Use the new type parameter syntax instead. (Contributed by Michael The in gh-107116 .)

User-defined functions : Assignment to a function’s __code__ attribute where the new code object’s type does not match the function’s type, is deprecated. The different types are: plain function, generator, async generator and coroutine. (Contributed by Irit Katriel in gh-81137 .)

wave : Deprecate the getmark() , setmark() and getmarkers() methods of the wave.Wave_read and wave.Wave_write classes. They will be removed in Python 3.15. (Contributed by Victor Stinner in gh-105096 .)

Pending Removal in Python 3.14 ¶

argparse : The type , choices , and metavar parameters of argparse.BooleanOptionalAction are deprecated and will be removed in 3.14. (Contributed by Nikita Sobolev in gh-92248 .)

ast : The following features have been deprecated in documentation since Python 3.8, now cause a DeprecationWarning to be emitted at runtime when they are accessed or used, and will be removed in Python 3.14:

ast.NameConstant

ast.Ellipsis

Use ast.Constant instead. (Contributed by Serhiy Storchaka in gh-90953 .)

collections.abc : Deprecated ByteString . Prefer Sequence or Buffer . For use in typing, prefer a union, like bytes | bytearray , or collections.abc.Buffer . (Contributed by Shantanu Jain in gh-91896 .)

email : Deprecated the isdst parameter in email.utils.localtime() . (Contributed by Alan Williams in gh-72346 .)

importlib : __package__ and __cached__ will cease to be set or taken into consideration by the import system ( gh-97879 ).

importlib.abc deprecated classes:

importlib.abc.ResourceReader

importlib.abc.Traversable

importlib.abc.TraversableResources

Use importlib.resources.abc classes instead:

importlib.resources.abc.Traversable

importlib.resources.abc.TraversableResources

(Contributed by Jason R. Coombs and Hugo van Kemenade in gh-93963 .)

itertools had undocumented, inefficient, historically buggy, and inconsistent support for copy, deepcopy, and pickle operations. This will be removed in 3.14 for a significant reduction in code volume and maintenance burden. (Contributed by Raymond Hettinger in gh-101588 .)

multiprocessing : The default start method will change to a safer one on Linux, BSDs, and other non-macOS POSIX platforms where 'fork' is currently the default ( gh-84559 ). Adding a runtime warning about this was deemed too disruptive as the majority of code is not expected to care. Use the get_context() or set_start_method() APIs to explicitly specify when your code requires 'fork' . See Contexts and start methods .

pathlib : is_relative_to() and relative_to() : passing additional arguments is deprecated.

pkgutil : find_loader() and get_loader() now raise DeprecationWarning ; use importlib.util.find_spec() instead. (Contributed by Nikita Sobolev in gh-97850 .)

master_open() : use pty.openpty() .

slave_open() : use pty.openpty() .

shutil.rmtree() onerror parameter is deprecated in 3.12, and will be removed in 3.14: use the onexc parameter instead.

version and version_info .

execute() and executemany() if named placeholders are used and parameters is a sequence instead of a dict .

date and datetime adapter, date and timestamp converter: see the sqlite3 documentation for suggested replacement recipes.

types.CodeType : Accessing co_lnotab was deprecated in PEP 626 since 3.10 and was planned to be removed in 3.12, but it only got a proper DeprecationWarning in 3.12. May be removed in 3.14. (Contributed by Nikita Sobolev in gh-101866 .)

typing : ByteString , deprecated since Python 3.9, now causes a DeprecationWarning to be emitted when it is used.

urllib : urllib.parse.Quoter is deprecated: it was not intended to be a public API. (Contributed by Gregory P. Smith in gh-88168 .)

xml.etree.ElementTree : Testing the truth value of an Element is deprecated and will raise an exception in Python 3.14.

Pending Removal in Python 3.15 ¶

http.server.CGIHTTPRequestHandler will be removed along with its related --cgi flag to python -m http.server . It was obsolete and rarely used. No direct replacement exists. Anything is better than CGI to interface a web server with a request handler.

locale : locale.getdefaultlocale() was deprecated in Python 3.11 and originally planned for removal in Python 3.13 ( gh-90817 ), but removal has been postponed to Python 3.15. Use locale.setlocale() , locale.getencoding() and locale.getlocale() instead. (Contributed by Hugo van Kemenade in gh-111187 .)

threading : Passing any arguments to threading.RLock() is now deprecated. C version allows any numbers of args and kwargs, but they are just ignored. Python version does not allow any arguments. All arguments will be removed from threading.RLock() in Python 3.15. (Contributed by Nikita Sobolev in gh-102029 .)

typing.NamedTuple :

The undocumented keyword argument syntax for creating NamedTuple classes ( NT = NamedTuple("NT", x=int) ) is deprecated, and will be disallowed in 3.15. Use the class-based syntax or the functional syntax instead.

When using the functional syntax to create a NamedTuple class, failing to pass a value to the fields parameter ( NT = NamedTuple("NT") ) is deprecated. Passing None to the fields parameter ( NT = NamedTuple("NT", None) ) is also deprecated. Both will be disallowed in Python 3.15. To create a NamedTuple class with 0 fields, use class NT(NamedTuple): pass or NT = NamedTuple("NT", []) .

typing.TypedDict : When using the functional syntax to create a TypedDict class, failing to pass a value to the fields parameter ( TD = TypedDict("TD") ) is deprecated. Passing None to the fields parameter ( TD = TypedDict("TD", None) ) is also deprecated. Both will be disallowed in Python 3.15. To create a TypedDict class with 0 fields, use class TD(TypedDict): pass or TD = TypedDict("TD", {}) .

Pending Removal in Python 3.16 ¶

array.array 'u' type ( wchar_t ): use the 'w' type instead ( Py_UCS4 ).

Pending Removal in Future Versions ¶

The following APIs were deprecated in earlier Python versions and will be removed, although there is currently no date scheduled for their removal.

argparse : Nesting argument groups and nesting mutually exclusive groups are deprecated.

~bool , bitwise inversion on bool.

bool(NotImplemented) .

Generators: throw(type, exc, tb) and athrow(type, exc, tb) signature is deprecated: use throw(exc) and athrow(exc) instead, the single argument signature.

Currently Python accepts numeric literals immediately followed by keywords, for example 0in x , 1or x , 0if 1else 2 . It allows confusing and ambiguous expressions like [0x1for x in y] (which can be interpreted as [0x1 for x in y] or [0x1f or x in y] ). A syntax warning is raised if the numeric literal is immediately followed by one of keywords and , else , for , if , in , is and or . In a future release it will be changed to a syntax error. ( gh-87999 )

Support for __index__() and __int__() method returning non-int type: these methods will be required to return an instance of a strict subclass of int .

Support for __float__() method returning a strict subclass of float : these methods will be required to return an instance of float .

Support for __complex__() method returning a strict subclass of complex : these methods will be required to return an instance of complex .

Delegation of int() to __trunc__() method.

calendar : calendar.January and calendar.February constants are deprecated and replaced by calendar.JANUARY and calendar.FEBRUARY . (Contributed by Prince Roshan in gh-103636 .)

codeobject.co_lnotab : use the codeobject.co_lines() method instead.

utcnow() : use datetime.datetime.now(tz=datetime.UTC) .

utcfromtimestamp() : use datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC) .

gettext : Plural value must be an integer.

importlib :

load_module() method: use exec_module() instead.

cache_from_source() debug_override parameter is deprecated: use the optimization parameter instead.

importlib.metadata :

EntryPoints tuple interface.

Implicit None on return values.

mailbox : Use of StringIO input and text mode is deprecated, use BytesIO and binary mode instead.

os : Calling os.register_at_fork() in multi-threaded process.

pydoc.ErrorDuringImport : A tuple value for exc_info parameter is deprecated, use an exception instance.

re : More strict rules are now applied for numerical group references and group names in regular expressions. Only sequence of ASCII digits is now accepted as a numerical reference. The group name in bytes patterns and replacement strings can now only contain ASCII letters and digits and underscore. (Contributed by Serhiy Storchaka in gh-91760 .)

sre_compile , sre_constants and sre_parse modules.

ssl options and protocols:

ssl.SSLContext without protocol argument is deprecated.

ssl.SSLContext : set_npn_protocols() and selected_npn_protocol() are deprecated: use ALPN instead.

ssl.OP_NO_SSL* options

ssl.OP_NO_TLS* options

ssl.PROTOCOL_SSLv3

ssl.PROTOCOL_TLS

ssl.PROTOCOL_TLSv1

ssl.PROTOCOL_TLSv1_1

ssl.PROTOCOL_TLSv1_2

ssl.TLSVersion.SSLv3

ssl.TLSVersion.TLSv1

ssl.TLSVersion.TLSv1_1

sysconfig.is_python_build() check_home parameter is deprecated and ignored.

threading methods:

threading.Condition.notifyAll() : use notify_all() .

threading.Event.isSet() : use is_set() .

threading.Thread.isDaemon() , threading.Thread.setDaemon() : use threading.Thread.daemon attribute.

threading.Thread.getName() , threading.Thread.setName() : use threading.Thread.name attribute.

threading.currentThread() : use threading.current_thread() .

threading.activeCount() : use threading.active_count() .

typing.Text ( gh-92332 ).

unittest.IsolatedAsyncioTestCase : it is deprecated to return a value that is not None from a test case.

urllib.parse deprecated functions: urlparse() instead

splitattr()

splithost()

splitnport()

splitpasswd()

splitport()

splitquery()

splittype()

splituser()

splitvalue()

urllib.request : URLopener and FancyURLopener style of invoking requests is deprecated. Use newer urlopen() functions and methods.

wsgiref : SimpleHandler.stdout.write() should not do partial writes.

zipimport.zipimporter.load_module() is deprecated: use exec_module() instead.

CPython Bytecode Changes ¶

The oparg of YIELD_VALUE is now 1 if the yield is part of a yield-from or await, and 0 otherwise. The oparg of RESUME was changed to add a bit indicating whether the except-depth is 1, which is needed to optimize closing of generators. (Contributed by Irit Katriel in gh-111354 .)

C API Changes ¶

You no longer have to define the PY_SSIZE_T_CLEAN macro before including Python.h when using # formats in format codes . APIs accepting the format codes always use Py_ssize_t for # formats. (Contributed by Inada Naoki in gh-104922 .)

The keywords parameter of PyArg_ParseTupleAndKeywords() and PyArg_VaParseTupleAndKeywords() now has type char * const * in C and const char * const * in C++, instead of char * * . It makes these functions compatible with arguments of type const char * const * , const char * * or char * const * in C++ and char * const * in C without an explicit type cast. This can be overridden with the PY_CXX_CONST macro. (Contributed by Serhiy Storchaka in gh-65210 .)

Add PyImport_AddModuleRef() : similar to PyImport_AddModule() , but return a strong reference instead of a borrowed reference . (Contributed by Victor Stinner in gh-105922 .)

Add PyWeakref_GetRef() function: similar to PyWeakref_GetObject() but returns a strong reference , or NULL if the referent is no longer live. (Contributed by Victor Stinner in gh-105927 .)

Add PyObject_GetOptionalAttr() and PyObject_GetOptionalAttrString() , variants of PyObject_GetAttr() and PyObject_GetAttrString() which don’t raise AttributeError if the attribute is not found. These variants are more convenient and faster if the missing attribute should not be treated as a failure. (Contributed by Serhiy Storchaka in gh-106521 .)

Add PyMapping_GetOptionalItem() and PyMapping_GetOptionalItemString() : variants of PyObject_GetItem() and PyMapping_GetItemString() which don’t raise KeyError if the key is not found. These variants are more convenient and faster if the missing key should not be treated as a failure. (Contributed by Serhiy Storchaka in gh-106307 .)

Add fixed variants of functions which silently ignore errors:

PyObject_HasAttrWithError() replaces PyObject_HasAttr() .

PyObject_HasAttrStringWithError() replaces PyObject_HasAttrString() .

PyMapping_HasKeyWithError() replaces PyMapping_HasKey() .

PyMapping_HasKeyStringWithError() replaces PyMapping_HasKeyString() .

New functions return not only 1 for true and 0 for false, but also -1 for error.

(Contributed by Serhiy Storchaka in gh-108511 .)

If Python is built in debug mode or with assertions , PyTuple_SET_ITEM() and PyList_SET_ITEM() now check the index argument with an assertion. (Contributed by Victor Stinner in gh-106168 .)

Add PyModule_Add() function: similar to PyModule_AddObjectRef() and PyModule_AddObject() but always steals a reference to the value. (Contributed by Serhiy Storchaka in gh-86493 .)

Add PyDict_GetItemRef() and PyDict_GetItemStringRef() functions: similar to PyDict_GetItemWithError() but returning a strong reference instead of a borrowed reference . Moreover, these functions return -1 on error and so checking PyErr_Occurred() is not needed. (Contributed by Victor Stinner in gh-106004 .)

Added PyDict_SetDefaultRef() , which is similar to PyDict_SetDefault() but returns a strong reference instead of a borrowed reference . This function returns -1 on error, 0 on insertion, and 1 if the key was already present in the dictionary. (Contributed by Sam Gross in gh-112066 .)

Add PyDict_ContainsString() function: same as PyDict_Contains() , but key is specified as a const char * UTF-8 encoded bytes string, rather than a PyObject * . (Contributed by Victor Stinner in gh-108314 .)

Added PyList_GetItemRef() function: similar to PyList_GetItem() but returns a strong reference instead of a borrowed reference .

Add Py_IsFinalizing() function: check if the main Python interpreter is shutting down . (Contributed by Victor Stinner in gh-108014 .)

Add PyLong_AsInt() function: similar to PyLong_AsLong() , but store the result in a C int instead of a C long . Previously, it was known as the private function _PyLong_AsInt() (with an underscore prefix). (Contributed by Victor Stinner in gh-108014 .)

Python built with configure --with-trace-refs (tracing references) now supports the Limited API . (Contributed by Victor Stinner in gh-108634 .)

Add PyObject_VisitManagedDict() and PyObject_ClearManagedDict() functions which must be called by the traverse and clear functions of a type using Py_TPFLAGS_MANAGED_DICT flag. The pythoncapi-compat project can be used to get these functions on Python 3.11 and 3.12. (Contributed by Victor Stinner in gh-107073 .)

Add PyUnicode_EqualToUTF8AndSize() and PyUnicode_EqualToUTF8() functions: compare Unicode object with a const char * UTF-8 encoded string and return true ( 1 ) if they are equal, or false ( 0 ) otherwise. These functions do not raise exceptions. (Contributed by Serhiy Storchaka in gh-110289 .)

Add PyThreadState_GetUnchecked() function: similar to PyThreadState_Get() , but don’t kill the process with a fatal error if it is NULL. The caller is responsible to check if the result is NULL. Previously, the function was private and known as _PyThreadState_UncheckedGet() . (Contributed by Victor Stinner in gh-108867 .)

Add PySys_AuditTuple() function: similar to PySys_Audit() , but pass event arguments as a Python tuple object. (Contributed by Victor Stinner in gh-85283 .)

PyArg_ParseTupleAndKeywords() now supports non-ASCII keyword parameter names. (Contributed by Serhiy Storchaka in gh-110815 .)

Add PyMem_RawMalloc() , PyMem_RawCalloc() , PyMem_RawRealloc() and PyMem_RawFree() to the limited C API (version 3.13). (Contributed by Victor Stinner in gh-85283 .)

Add PySys_Audit() and PySys_AuditTuple() functions to the limited C API. (Contributed by Victor Stinner in gh-85283 .)

Add PyErr_FormatUnraisable() function: similar to PyErr_WriteUnraisable() , but allow customizing the warning message. (Contributed by Serhiy Storchaka in gh-108082 .)

Add PyList_Extend() and PyList_Clear() functions: similar to Python list.extend() and list.clear() methods. (Contributed by Victor Stinner in gh-111138 .)

Add PyDict_Pop() and PyDict_PopString() functions: remove a key from a dictionary and optionally return the removed value. This is similar to dict.pop() , but without the default value and not raising KeyError if the key is missing. (Contributed by Stefan Behnel and Victor Stinner in gh-111262 .)

Add Py_HashPointer() function to hash a pointer. (Contributed by Victor Stinner in gh-111545 .)

Add PyObject_GenericHash() function that implements the default hashing function of a Python object. (Contributed by Serhiy Storchaka in gh-113024 .)

Add PyTime C API:

PyTime_t type.

PyTime_MIN and PyTime_MAX constants.

Add functions:

PyTime_AsSecondsDouble() .

PyTime_Monotonic() .

PyTime_MonotonicRaw() .

PyTime_PerfCounter() .

PyTime_PerfCounterRaw() .

PyTime_Time() .

PyTime_TimeRaw() .

(Contributed by Victor Stinner and Petr Viktorin in gh-110850 .)

Add PyLong_AsNativeBytes() , PyLong_FromNativeBytes() and PyLong_FromUnsignedNativeBytes() functions to simplify converting between native integer types and Python int objects. (Contributed by Steve Dower in gh-111140 .)

Add PyType_GetFullyQualifiedName() function to get the type’s fully qualified name. Equivalent to f"{type.__module__}.{type.__qualname__}" , or type.__qualname__ if type.__module__ is not a string or is equal to "builtins" . (Contributed by Victor Stinner in gh-111696 .)

Add PyType_GetModuleName() function to get the type’s module name. Equivalent to getting the type.__module__ attribute. (Contributed by Eric Snow and Victor Stinner in gh-111696 .)

Add support for %T , %#T , %N and %#N formats to PyUnicode_FromFormat() : format the fully qualified name of an object type and of a type: call PyType_GetModuleName() . See PEP 737 for more information. (Contributed by Victor Stinner in gh-111696 .)

Add Py_GetConstant() and Py_GetConstantBorrowed() functions to get constants. For example, Py_GetConstant(Py_CONSTANT_ZERO) returns a strong reference to the constant zero. (Contributed by Victor Stinner in gh-115754 .)

Add PyType_GetModuleByDef() to the limited C API (Contributed by Victor Stinner in gh-116936 .)

Add two new functions to the C-API, PyRefTracer_SetTracer() and PyRefTracer_GetTracer() , that allows to track object creation and destruction the same way the tracemalloc module does. (Contributed by Pablo Galindo in gh-93502 .)

Build Changes ¶

The configure option --with-system-libmpdec now defaults to yes . The bundled copy of libmpdecimal will be removed in Python 3.15.

Autoconf 2.71 and aclocal 1.16.4 are now required to regenerate the configure script. (Contributed by Christian Heimes in gh-89886 .)

SQLite 3.15.2 or newer is required to build the sqlite3 extension module. (Contributed by Erlend Aasland in gh-105875 .)

Python built with configure --with-trace-refs (tracing references) is now ABI compatible with the Python release build and debug build . (Contributed by Victor Stinner in gh-108634 .)

Building CPython now requires a compiler with support for the C11 atomic library, GCC built-in atomic functions, or MSVC interlocked intrinsics.

The errno , fcntl , grp , md5 , pwd , resource , termios , winsound , _ctypes_test , _multiprocessing.posixshmem , _scproxy , _stat , _statistics , _testconsole , _testimportmultiple and _uuid C extensions are now built with the limited C API . (Contributed by Victor Stinner in gh-85283 .)

wasm32-wasi is now a PEP 11 tier 2 platform. (Contributed by Brett Cannon in gh-115192 .)

wasm32-emscripten is no longer a PEP 11 supported platform. (Contributed by Brett Cannon in gh-115192 .)

Python now bundles the mimalloc library . It is licensed under the MIT license; see mimalloc license . The bundled mimalloc has custom changes, see gh-113141 for details. (Contributed by Dino Viehland in gh-109914 .)

Porting to Python 3.13 ¶

This section lists previously described changes and other bugfixes that may require changes to your code.

Changes in the Python API ¶

An OSError is now raised by getpass.getuser() for any failure to retrieve a username, instead of ImportError on non-Unix platforms or KeyError on Unix platforms where the password database is empty.

The threading module now expects the _thread module to have an _is_main_interpreter attribute. It is a function with no arguments that returns True if the current interpreter is the main interpreter.

Any library or application that provides a custom _thread module must provide _is_main_interpreter() , just like the module’s other “private” attributes. (See gh-112826 .)

mailbox.Maildir now ignores files with a leading dot. (Contributed by Zackery Spytz in gh-65559 .)

pathlib.Path.glob() and rglob() now return both files and directories if a pattern that ends with “ ** ” is given, rather than directories only. Users may add a trailing slash to match only directories.

The value of the mode attribute of gzip.GzipFile was changed from integer ( 1 or 2 ) to string ( 'rb' or 'wb' ). The value of the mode attribute of the readable file-like object returned by zipfile.ZipFile.open() was changed from 'r' to 'rb' . (Contributed by Serhiy Storchaka in gh-115961 .)

Calling locals() in an optimized scope now produces an independent snapshot on each call, and hence no longer implicitly updates previously returned references. Obtaining the legacy CPython behaviour now requires explicit calls to update the initially returned dictionary with the results of subsequent calls to locals() . (Changed as part of PEP 667 .)

Calling locals() from a comprehension at module or class scope (including via exec or eval ) once more behaves as if the comprehension were running as an independent nested function (i.e. the local variables from the containing scope are not included). In Python 3.12, this had changed to include the local variables from the containing scope when implementing PEP 709 . (Changed as part of PEP 667 .)

Accessing FrameType.f_locals in an optimized scope now returns a write-through proxy rather than a snapshot that gets updated at ill-specified times. If a snapshot is desired, it must be created explicitly with dict or the proxy’s .copy() method. (Changed as part of PEP 667 .)

Changes in the C API ¶

Python.h no longer includes the <ieeefp.h> standard header. It was included for the finite() function which is now provided by the <math.h> header. It should now be included explicitly if needed. Remove also the HAVE_IEEEFP_H macro. (Contributed by Victor Stinner in gh-108765 .)

Python.h no longer includes these standard header files: <time.h> , <sys/select.h> and <sys/time.h> . If needed, they should now be included explicitly. For example, <time.h> provides the clock() and gmtime() functions, <sys/select.h> provides the select() function, and <sys/time.h> provides the futimes() , gettimeofday() and setitimer() functions. (Contributed by Victor Stinner in gh-108765 .)

On Windows, Python.h no longer includes the <stddef.h> standard header file. If needed, it should now be included explicitly. For example, it provides offsetof() function, and size_t and ptrdiff_t types. Including <stddef.h> explicitly was already needed by all other platforms, the HAVE_STDDEF_H macro is only defined on Windows. (Contributed by Victor Stinner in gh-108765 .)

If the Py_LIMITED_API macro is defined, Py_BUILD_CORE , Py_BUILD_CORE_BUILTIN and Py_BUILD_CORE_MODULE macros are now undefined by <Python.h> . (Contributed by Victor Stinner in gh-85283 .)

The old trashcan macros Py_TRASHCAN_SAFE_BEGIN and Py_TRASHCAN_SAFE_END were removed. They should be replaced by the new macros Py_TRASHCAN_BEGIN and Py_TRASHCAN_END .

A tp_dealloc function that has the old macros, such as:

should migrate to the new macros as follows:

Note that Py_TRASHCAN_BEGIN has a second argument which should be the deallocation function it is in. The new macros were added in Python 3.8 and the old macros were deprecated in Python 3.11. (Contributed by Irit Katriel in gh-105111 .)

Functions PyDict_GetItem() , PyDict_GetItemString() , PyMapping_HasKey() , PyMapping_HasKeyString() , PyObject_HasAttr() , PyObject_HasAttrString() , and PySys_GetObject() , which clear all errors which occurred when calling them, now report them using sys.unraisablehook() . You may replace them with other functions as recommended in the documentation. (Contributed by Serhiy Storchaka in gh-106672 .)

PyCode_GetFirstFree() is an unstable API now and has been renamed to PyUnstable_Code_GetFirstFree() . (Contributed by Bogdan Romanyuk in gh-115781 .)

Removed C APIs ¶

Remove many APIs (functions, macros, variables) with names prefixed by _Py or _PY (considered as private API). If your project is affected by one of these removals and you consider that the removed API should remain available, please open a new issue to request a public C API and add cc @vstinner to the issue to notify Victor Stinner. (Contributed by Victor Stinner in gh-106320 .)

Remove functions deprecated in Python 3.9:

PyEval_CallObject() , PyEval_CallObjectWithKeywords() : use PyObject_CallNoArgs() or PyObject_Call() instead. Warning: PyObject_Call() positional arguments must be a tuple and must not be NULL , keyword arguments must be a dict or NULL , whereas removed functions checked arguments type and accepted NULL positional and keyword arguments. To replace PyEval_CallObjectWithKeywords(func, NULL, kwargs) with PyObject_Call() , pass an empty tuple as positional arguments using PyTuple_New(0) .

PyEval_CallFunction() : use PyObject_CallFunction() instead.

PyEval_CallMethod() : use PyObject_CallMethod() instead.

PyCFunction_Call() : use PyObject_Call() instead.

(Contributed by Victor Stinner in gh-105107 .)

Remove old buffer protocols deprecated in Python 3.0. Use Buffer Protocol instead.

PyObject_CheckReadBuffer() : Use PyObject_CheckBuffer() to test if the object supports the buffer protocol. Note that PyObject_CheckBuffer() doesn’t guarantee that PyObject_GetBuffer() will succeed. To test if the object is actually readable, see the next example of PyObject_GetBuffer() .

PyObject_AsCharBuffer() , PyObject_AsReadBuffer() : PyObject_GetBuffer() and PyBuffer_Release() instead:

PyObject_AsWriteBuffer() : Use PyObject_GetBuffer() and PyBuffer_Release() instead:

(Contributed by Inada Naoki in gh-85275 .)

Remove the following old functions to configure the Python initialization, deprecated in Python 3.11:

PySys_AddWarnOptionUnicode() : use PyConfig.warnoptions instead.

PySys_AddWarnOption() : use PyConfig.warnoptions instead.

PySys_AddXOption() : use PyConfig.xoptions instead.

PySys_HasWarnOptions() : use PyConfig.xoptions instead.

PySys_SetPath() : set PyConfig.module_search_paths instead.

Py_SetPath() : set PyConfig.module_search_paths instead.

Py_SetStandardStreamEncoding() : set PyConfig.stdio_encoding instead, and set also maybe PyConfig.legacy_windows_stdio (on Windows).

_Py_SetProgramFullPath() : set PyConfig.executable instead.

Use the new PyConfig API of the Python Initialization Configuration instead ( PEP 587 ), added to Python 3.8. (Contributed by Victor Stinner in gh-105145 .)

Remove PyEval_ThreadsInitialized() function, deprecated in Python 3.9. Since Python 3.7, Py_Initialize() always creates the GIL: calling PyEval_InitThreads() does nothing and PyEval_ThreadsInitialized() always returned non-zero. (Contributed by Victor Stinner in gh-105182 .)

Remove PyEval_AcquireLock() and PyEval_ReleaseLock() functions, deprecated in Python 3.2. They didn’t update the current thread state. They can be replaced with:

PyEval_SaveThread() and PyEval_RestoreThread() ;

low-level PyEval_AcquireThread() and PyEval_RestoreThread() ;

or PyGILState_Ensure() and PyGILState_Release() .

(Contributed by Victor Stinner in gh-105182 .)

Remove private _PyObject_FastCall() function: use PyObject_Vectorcall() which is available since Python 3.8 ( PEP 590 ). (Contributed by Victor Stinner in gh-106023 .)

Remove cpython/pytime.h header file: it only contained private functions. (Contributed by Victor Stinner in gh-106316 .)

Remove _PyInterpreterState_Get() alias to PyInterpreterState_Get() which was kept for backward compatibility with Python 3.8. The pythoncapi-compat project can be used to get PyInterpreterState_Get() on Python 3.8 and older. (Contributed by Victor Stinner in gh-106320 .)

The PyModule_AddObject() function is now soft deprecated : PyModule_Add() or PyModule_AddObjectRef() functions should be used instead. (Contributed by Serhiy Storchaka in gh-86493 .)

Deprecated C APIs ¶

Deprecate the old Py_UNICODE and PY_UNICODE_TYPE types: use directly the wchar_t type instead. Since Python 3.3, Py_UNICODE and PY_UNICODE_TYPE are just aliases to wchar_t . (Contributed by Victor Stinner in gh-105156 .)

Deprecate old Python initialization functions:

PySys_ResetWarnOptions() : clear sys.warnoptions and warnings.filters instead.

Py_GetExecPrefix() : get sys.exec_prefix instead.

Py_GetPath() : get sys.path instead.

Py_GetPrefix() : get sys.prefix instead.

Py_GetProgramFullPath() : get sys.executable instead.

Py_GetProgramName() : get sys.executable instead.

Py_GetPythonHome() : get PyConfig.home or PYTHONHOME environment variable instead.

Functions scheduled for removal in Python 3.15. (Contributed by Victor Stinner in gh-105145 .)

Deprecate the PyImport_ImportModuleNoBlock() function which is just an alias to PyImport_ImportModule() since Python 3.3. Scheduled for removal in Python 3.15. (Contributed by Victor Stinner in gh-105396 .)

Deprecate the PyWeakref_GetObject() and PyWeakref_GET_OBJECT() functions, which return a borrowed reference : use the new PyWeakref_GetRef() function instead, it returns a strong reference . The pythoncapi-compat project can be used to get PyWeakref_GetRef() on Python 3.12 and older. (Contributed by Victor Stinner in gh-105927 .)

Creating immutable types ( Py_TPFLAGS_IMMUTABLETYPE ) with mutable bases using the C API.

Functions to configure the Python initialization, deprecated in Python 3.11:

PySys_SetArgvEx() : set PyConfig.argv instead.

PySys_SetArgv() : set PyConfig.argv instead.

Py_SetProgramName() : set PyConfig.program_name instead.

Py_SetPythonHome() : set PyConfig.home instead.

The Py_InitializeFromConfig() API should be used with PyConfig instead.

Global configuration variables:

Py_DebugFlag : use PyConfig.parser_debug

Py_VerboseFlag : use PyConfig.verbose

Py_QuietFlag : use PyConfig.quiet

Py_InteractiveFlag : use PyConfig.interactive

Py_InspectFlag : use PyConfig.inspect

Py_OptimizeFlag : use PyConfig.optimization_level

Py_NoSiteFlag : use PyConfig.site_import

Py_BytesWarningFlag : use PyConfig.bytes_warning

Py_FrozenFlag : use PyConfig.pathconfig_warnings

Py_IgnoreEnvironmentFlag : use PyConfig.use_environment

Py_DontWriteBytecodeFlag : use PyConfig.write_bytecode

Py_NoUserSiteDirectory : use PyConfig.user_site_directory

Py_UnbufferedStdioFlag : use PyConfig.buffered_stdio

Py_HashRandomizationFlag : use PyConfig.use_hash_seed and PyConfig.hash_seed

Py_IsolatedFlag : use PyConfig.isolated

Py_LegacyWindowsFSEncodingFlag : use PyPreConfig.legacy_windows_fs_encoding

Py_LegacyWindowsStdioFlag : use PyConfig.legacy_windows_stdio

Py_FileSystemDefaultEncoding : use PyConfig.filesystem_encoding

Py_HasFileSystemDefaultEncoding : use PyConfig.filesystem_encoding

Py_FileSystemDefaultEncodeErrors : use PyConfig.filesystem_errors

Py_UTF8Mode : use PyPreConfig.utf8_mode (see Py_PreInitialize() )

The bundled copy of libmpdecimal .

PyImport_ImportModuleNoBlock() : use PyImport_ImportModule() .

PyWeakref_GET_OBJECT() : use PyWeakref_GetRef() instead.

PyWeakref_GetObject() : use PyWeakref_GetRef() instead.

Py_UNICODE_WIDE type: use wchar_t instead.

Py_UNICODE type: use wchar_t instead.

Python initialization functions:

Py_TPFLAGS_HAVE_FINALIZE : no needed since Python 3.8.

PyErr_Fetch() : use PyErr_GetRaisedException() .

PyErr_NormalizeException() : use PyErr_GetRaisedException() .

PyErr_Restore() : use PyErr_SetRaisedException() .

PyModule_GetFilename() : use PyModule_GetFilenameObject() .

PyOS_AfterFork() : use PyOS_AfterFork_Child() .

PySlice_GetIndicesEx() .

PyUnicode_AsDecodedObject() .

PyUnicode_AsDecodedUnicode() .

PyUnicode_AsEncodedObject() .

PyUnicode_AsEncodedUnicode() .

PyUnicode_READY() : not needed since Python 3.12.

_PyErr_ChainExceptions() .

PyBytesObject.ob_shash member: call PyObject_Hash() instead.

PyDictObject.ma_version_tag member.

PyThread_create_key() : use PyThread_tss_alloc() .

PyThread_delete_key() : use PyThread_tss_free() .

PyThread_set_key_value() : use PyThread_tss_set() .

PyThread_get_key_value() : use PyThread_tss_get() .

PyThread_delete_key_value() : use PyThread_tss_delete() .

PyThread_ReInitTLS() : no longer needed.

Remove undocumented PY_TIMEOUT_MAX constant from the limited C API. (Contributed by Victor Stinner in gh-110014 .)

Regression Test Changes ¶

Python built with configure --with-pydebug now supports a -X presite=package.module command-line option. If used, it specifies a module that should be imported early in the lifecycle of the interpreter, before site.py is executed. (Contributed by Łukasz Langa in gh-110769 .)

Table of Contents

  • Summary – Release Highlights
  • A Better Interactive Interpreter
  • Improved Error Messages
  • Defined mutation semantics for locals()
  • Incremental Garbage Collection
  • Support For Mobile Platforms
  • Experimental JIT Compiler
  • Free-threaded CPython
  • Other Language Changes
  • New Modules
  • unicodedata
  • xml.etree.ElementTree
  • Optimizations
  • PEP 594: dead batteries (and other module removals)
  • configparser
  • Pending Removal in Python 3.14
  • Pending Removal in Python 3.15
  • Pending Removal in Python 3.16
  • Pending Removal in Future Versions
  • CPython Bytecode Changes
  • New Features
  • Build Changes
  • Changes in the Python API
  • Changes in the C API
  • Removed C APIs
  • Deprecated C APIs
  • Regression Test Changes

Previous topic

What’s New in Python

What’s New In Python 3.12

  • Report a Bug
  • Show Source
  • Online Degree Explore Bachelor’s & Master’s degrees
  • MasterTrack™ Earn credit towards a Master’s degree
  • University Certificates Advance your career with graduate-level learning
  • Top Courses
  • Join for Free

Periodic Table of Python Principles

Learn Python with the periodic table guide. Discover core concepts, advanced techniques, and essential skills quickly.

Periodic Table of Python Principles

Explore Python programming concepts structured as a periodic table. This visual tool categorizes and organizes the core components of Python into an easily navigable format, making it accessible for learners at all levels. Whether you're a novice eager to start coding, a professional programmer aiming to bolster your Python skills, or a tech enthusiast looking to understand more about this versatile language, this periodic table will guide you through each concept. Explore topics from basic syntax and data types to advanced modules and libraries to see how these elements empower effective and efficient programming.

Read more: What Is Python?

Python Basics

Start your Python journey in the Foundations category with Python Syntax (S), where you'll learn the fundamental structures of Python coding. Understand Variables (V) for data storage, Data Types (D) to optimize the use of various data forms, and Operators (O) for performing operations on values and variables.

Read more: Understanding Different Types of Data

Control Structures

In the Control Structures section, learn about Conditional Statements (CS) to make decisions within your code, Loops (L) to repeat tasks efficiently, and Error Handling (E) to manage exceptions and maintain code flow during unexpected issues.

Functions and Modules

Explore Functions (F) to encapsulate reusable code that performs specific tasks, enhancing modularity and code readability. Learn about Modules (M) for organizing functions, classes, and other data in separate files, making your projects easier to manage and scale.

Data Handling

The Data Handling group introduces you to Lists (L) and Dictionaries (DI) for storing data collections. Understand File I/O (FI) to read from and write to files, an essential skill for data-driven applications.

Object-Oriented Programming

Advance to Object-Oriented Programming with Classes (C) and Objects (OB) to model real-world phenomena. Explore Inheritance (I) to leverage code reuse and build complex relationships within your programs.

Libraries and Frameworks

Python's strength lies in its extensive ecosystem. In Libraries and Frameworks, familiarize yourself with NumPy (N) for numerical operations, Pandas (P) for data analysis, and Flask (F) for web applications. Learn Django (D) for more detailed web development.

Artificial Intelligence and Machine Learning

Enter the world of Artificial Intelligence and Machine Learning using Python. Leverage Python's powerful libraries, like TensorFlow (TF) and PyTorch (PT), to build machine learning models. Explore the basics of machine learning with Scikit-learn (SK) and advance to AI applications involving Deep Learning (DL), Natural Language Processing (NL), and Computer Vision (CV). This section prepares you to tackle real-world problems with cutting-edge AI techniques.

This guide helps you develop your knowledge and skills in Python. Understanding and applying these principles will enable you to tackle Python programming challenges and create effective solutions. Explore Python courses .

Coursera Plus

Build job-ready skills with a Coursera Plus subscription

  • Get access to 7,000+ learning programs from world-class universities and companies, including Google, Yale, Salesforce, and more
  • Try different courses and find your best fit at no additional cost
  • Earn certificates for learning programs you complete
  • A subscription price of $59/month, cancel anytime

Coursera is the global online learning platform that offers anyone, anywhere access to online course...

This content has been made available for informational purposes only. Learners are advised to conduct additional research to ensure that courses and other credentials pursued meet their personal, professional, and financial goals.

COMMENTS

  1. Python's Assignment Operator: Write Robust Assignments

    Here, variable represents a generic Python variable, while expression represents any Python object that you can provide as a concrete value—also known as a literal—or an expression that evaluates to a value. To execute an assignment statement like the above, Python runs the following steps: Evaluate the right-hand expression to produce a concrete value or object.

  2. python

    The only way to have a new instance is by creating one. >>> x=3. >>> id(x)==id(y) False. >>> x==y. False. This may sound complicated at first instance but to simplify a bit, Python made some types immutable. For example you can't change a string. You have to slice it and create a new string object.

  3. Different Forms of Assignment Statements in Python

    Multiple- target assignment: x = y = 75. print(x, y) In this form, Python assigns a reference to the same object (the object which is rightmost) to all the target on the left. OUTPUT. 75 75. 7. Augmented assignment : The augmented assignment is a shorthand assignment that combines an expression and an assignment.

  4. Python: Assignment vs Shallow Copy vs Deep Copy

    In Python 3, you can use list.copy(). However, I prefer the equivalent expression list[:] because it works in both Python 2 and 3. Shallow copy is different from assignment in that it creates a ...

  5. Assignment, Shallow Copy, Or Deep Copy?

    Memory Management In Python. int, float, list, dict, class instances, … they are all objects in Python.In CPython implementation, built-in function id() returns memory address of an object — >>> L1 = [1, 2, 3] >>> id(L1) 3061530120 If we create a new variable L2 that refers to an object with the same value as L1, L2 will have a new memory address — ...

  6. Object-Oriented Programming (OOP) in Python 3

    Object-oriented programming (OOP) is a method of structuring a program by bundling related properties and behaviors into individual objects. In this tutorial, you'll learn the basics of object-oriented programming in Python. Conceptually, objects are like the components of a system. Think of a program as a factory assembly line of sorts.

  7. Assignment in Python

    00:00 Since Python's argument passing mechanism relies so much on how Python deals with assignment, the next couple of lessons will go into a bit more depth about how assignment works in Python.. 00:12 Recall some things I've already mentioned: Assignment is the process of binding a name to an object. Parameter names are also bound to objects on function entry in Python.

  8. Variables & Assignment

    In general, assigning a variable b to a variable a will cause the variables to reference the same object in the system's memory, and assigning c to a or b will simply have a third variable reference this same object. Then any change (a.k.a mutation) of the object will be reflected in all of the variables that reference it (a, b, and c).

  9. Assignment Operators in Python

    We use Python assignment statements to assign objects to names. The target of an assignment statement is written on the left side of the equal sign (=), and the object on the right can be an arbitrary expression that computes an object. There are some important properties of assignment in Python :- Assignment creates object references instead of co

  10. 9. Classes

    The nonlocal assignment changed scope_test's binding of spam, ... A method is a function that "belongs to" an object. (In Python, the term method is not unique to class instances: other object types can have methods as well. For example, list objects have methods called append, insert, remove, sort, and so on. ...

  11. Python Object Oriented Programming (With Examples)

    Python is a versatile programming language that supports various programming styles, including object-oriented programming (OOP) through the use of objects and classes. An object is any entity that has attributes and behaviors. For example, a parrot is an object. It has. Similarly, a class is a blueprint for that object.

  12. Python Variable Assignment. Explaining One Of The Most Fundamental

    The fundamental concept to understand is that everything is an object in Python. Python supports numbers, strings, sets, lists, tuples, and dictionaries. These are the standard data types. I will explain each of them in detail. Declare And Assign Value To Variable. Assignment sets a value to a variable. To assign variable a value, use the ...

  13. Does python copy objects on assignment?

    In Python, there are two spaces, the namespace and the object space. Names are just labels you assign to objects, which live in the object space. Objects have values and types; names are just there for our convenience; so that we may access things in the object space.

  14. 6. Expressions

    The value of an object is a rather abstract notion in Python: For example, there is no canonical access method for an object's value. Also, there is no requirement that the value of an object should be constructed in a particular way, e.g. comprised of all its data attributes. ... assignment_expression::= [identifier ":="] expression.

  15. Variables in Python

    In Python, variables need not be declared or defined in advance, as is the case in many other programming languages. To create a variable, you just assign it a value and then start using it. Assignment is done with a single equals sign ( = ): Python. >>> n = 300. This is read or interpreted as " n is assigned the value 300 .".

  16. Python Operators Cheat Sheet

    Augmented assignment operators are simply used as a shortcut. Instead of writing x = x + 1, they allow us to write x += 1, effectively "updating" a variable in a concise manner. Here's a code sample of how this works: # Initial assignment. x = 10. print(x) . # output: 10. # Augmented assignment operator: subtraction. x -= 2.

  17. How to Learn Python from Scratch in 2024

    This function takes three arguments.1) start: integer starting from which the sequence of integers is to be returned. 2) stop: integer before which the sequence of integers is to be returned. 3) step: integer value which determines the increment between each integer in the sequence. filter_none. Python.

  18. Do assignments ever require locking?

    Assignments for mutable types/complex objects correspond to multiple byte code instructions. My understanding that a thread switch can occur between any two byte code instructions. I tried to find a good reference in the official Python docs. Best I could find was this: What kind of global mutation are thread-safe? which is rather fuzzy.

  19. What's New In Python 3.13

    User-defined functions: Assignment to a function's __code__ attribute where the new code object's type does not match the function's type, is deprecated. The different types are: plain function, generator, async generator and coroutine. ... , but pass event arguments as a Python tuple object. (Contributed by Victor Stinner in gh-85283 ...

  20. python

    I was trying to assign a Python object to another in-place using a member function such as replace_object() below. However, as you can see, object_A remains unchanged and the only way to copy object_B is to create an entirely new object object_C, which defeats the purpose of in-place assignment.

  21. Variable Assignment

    Variable Assignment. Think of a variable as a name attached to a particular object. In Python, variables need not be declared or defined in advance, as is the case in many other programming languages. To create a variable, you just assign it a value and then start using it. Assignment is done with a single equals sign ( = ).

  22. Periodic Table of Python Principles

    Learn Python with the periodic table guide. Discover core concepts, advanced techniques, and essential skills quickly. Explore Python programming concepts structured as a periodic table. This visual tool categorizes and organizes the core components of Python into an easily navigable format, making it accessible for learners at all levels.

  23. How I Assess the Memory Consumption of My Python Code

    In the above code, the function sys.getsizeof(x) will give us the memory consumption of the list x straightaway. However, we have to be careful that this function will only return the size of the variable (in this case, it is the list x) but not include the items it refers to (in this case, the integers).. If you want to know more about the details of this function, please check out the ...

  24. How do I assign a property to an instance in Python?

    Using python, one can set an attribute of a instance via either of the two methods below: >>> class Foo(object): pass >>> a = Foo() >>> a.x = 1 >>> a.x 1 &...

  25. arXiv:2405.13930v1 [cond-mat.mtrl-sci] 22 May 2024

    processed simultaneously, a resource assignment mechanism is used to avoid conflicts between tasks in resource assignment. Before initiating control over ... All tasks are defined as Python objects inherited from the BaseTask class available in the AlabOS package, 10. providing universal methods for interacting with manager processes, the logger,

  26. Python's list Data Type: A Deep Dive With Examples

    In Python, you can create aliases of variables using the assignment operator (=). Assignments don't create copies of objects in Python. Instead, they create bindings between the variable and the object involved in the assignment. Therefore, when you have several aliases of a given list, changes in an alias will affect the rest of the aliases.

  27. Vulnerability Summary for the Week of May 20, 2024

    The Hash Form - Drag & Drop Form Builder plugin for WordPress is vulnerable to PHP Object Injection in all versions up to, and including, 1.1.0 via deserialization of untrusted input in the 'process_entry' function. ... An incorrect permission assignment for critical resource vulnerability has been reported to affect several QNAP operating ...

  28. python

    b = container() # change b's info attribute. b.info = "b's info attribute". # bound method test is set as use of b and in this case unbound, i think. b.use = self.test. # should read b's info attribute and print it. # should output: test: b's info attribute but test is bound in some way to the tree object. print b.use()

  29. Python Classes: The Power of Object-Oriented Programming

    Python supports the object-oriented programming paradigm through classes. They provide an elegant way to define reusable pieces of code that encapsulate data and behavior in a single entity. With classes, you can quickly and intuitively model real-world objects and solve complex problems.

  30. Python: how to determine if an object is iterable?

    Checking isinstance(obj, Iterable) detects classes that are registered as Iterable or that have an __iter__() method, but it does not detect classes that iterate with the __getitem__() method. The only reliable way to determine whether an object is iterable is to call iter(obj). edited Mar 4, 2022 at 17:02.