Home > Backend Development > Python Tutorial > Why Does This Python Closure Example Print \'4 4 4\' Instead of \'0 2 4\'?

Why Does This Python Closure Example Print \'4 4 4\' Instead of \'0 2 4\'?

Patricia Arquette
Release: 2024-11-29 08:12:10
Original
264 people have browsed it

Why Does This Python Closure Example Print

Understanding Lexical Closures: A Python Conundrum

In the realm of functional programming, lexical closures play a crucial role. However, certain programming languages can introduce complexities in understanding their behavior. Python, for instance, offers an intriguing puzzle that illustrates the interplay of closures and environments.

The following Python code snippet serves as an example:

flist = []

for i in xrange(3):
    def func(x): return x * i
    flist.append(func)

for f in flist:
    print f(2)
Copy after login

This code surprisingly prints "4 4 4" instead of the expected "0 2 4". While one might initially suspect that the global variable i is shared among the functions, the problem persists even when i is declared locally within a nested function.

The key to understanding this behavior lies in the concept of closures. In Python, each nested function retains the closure of its containing scope. In this case, the nested functions share the closure of the global environment, including the mutable variable i. As i is modified during the loop, all the functions reference the modified value.

To circumvent this issue and ensure the desired behavior, one can resort to a function creator approach. By invoking a creator function instead of creating functions inline, distinct environments are established for each function created.

Here's an example of the revised code:

flist = []

for i in xrange(3):
    def funcC(j):
        def func(x): return x * j
        return func
    flist.append(funcC(i))

for f in flist:
    print f(2)
Copy after login

This approach effectively generates separate functions with unique closures, leading to the expected output of "0 2 4".

Thus, while closures offer powerful capabilities, their interplay with environments can introduce subtle complexities. Careful consideration of scope and the nuances of closures are essential for harnessing their full potential.

The above is the detailed content of Why Does This Python Closure Example Print \'4 4 4\' Instead of \'0 2 4\'?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template