call-by-value-and-call-by-reference-in-python

“`html

In Python coding, grasping how functions accept and manage arguments is vital. Numerous programmers, particularly those with backgrounds in different languages, frequently wonder if Python employs call by value, call by reference, a mix of both, or a completely distinct model. This differentiation is crucial as it influences whether modifications made within a function affect the original data outside of it. In this article, you will learn the meanings of call by value and call by reference, how Python deals with mutable and immutable data during function invocations, supplemented by comprehensive examples.

Table of Contents:

What is Call by Value in Python?

Call by value indicates a scenario wherein a function obtains a duplicate of the argument’s value, rather than the original variable itself. In this approach, changes made to the parameter within the function do not affect the original variable outside of it. While Python does not apply call by value in the identical manner as C, immutable types like integers, floats, and strings exhibit similar characteristics. Any alteration made to these types within a function results in the creation of a new object, leaving the original data unaffected. This behavior resembles call by value, even though Python does not strictly adhere to this method.

What is Call by Reference in Python?

Call by reference describes the technique of invoking functions where the reference to the original variable is transmitted, rather than a copy of its value. This allows the function to modify the actual data in memory. Although Python does not use pointers for call by reference like C++, it demonstrates reference-like behavior when mutable objects (such as lists, dictionaries, or user-defined types) are provided as arguments. Any modification to such an object within the function is also observable outside the function. This happens because both the original variable and the function parameter refer to the same object in memory.

Unlock Python: Enhance Your Programming Abilities!
Engage in real-world coding projects and gain confidence in writing clean, efficient Python code.
quiz-icon

Is Python Call by Value or Call by Reference?

Python employs call by object reference (also referred to as call by sharing), where a function is provided with a reference to the original object in memory. Nevertheless, the reference itself is passed by value, indicating that the function receives a copy of the reference, rather than the actual variable. As a result, the function operates directly on the same object, meaning any adjustments to mutable objects (such as lists or dictionaries) inside the function will influence the original object outside. Conversely, if the function reassigns the parameter to a new object, this reassignment will only modify the local reference within the function and will not affect the original variable externally. This model clarifies why Python behaves differently from classical call by value or call by reference methodologies utilized in other programming languages.

Examples of Call by Value and Call by Reference in Python

To discern the behavior of function arguments in Python, a distinction must be made between immutable and mutable data types. The examples below illustrate how Python manages object references during function calls.

Example 1: Immutable Types (int, str)

In this case, immutable types such as integers and strings are presented to functions. Any modifications to these objects within the function lead to the creation of a new object instead of altering the original.

Example:

Python

Code Copied!

var isMobileDevice = window.innerWidth "");

editor98329.setValue(contentDecoded); // Set the initial text editor98329.clearSelection();

editor98329.setOptions({ maxLines: Infinity });

function decodeHTML98329(input) { var documentFragment = new DOMParser().parseFromString(input, "text/html"); return documentFragment.documentElement.textContent; }

// Function to store code on clipboard function copyCodeToClipboard98329() { const code = editor98329.getValue(); // Retrieve code from the editor navigator.clipboard.writeText(code).then(() => { jQuery(".maineditor98329 .copymessage").show(); setTimeout(function() { jQuery(".maineditor98329 .copymessage").hide(); }, 2000); }).catch(err => { console.error("Error copying code: ", err); }); }

function executeCode98329() { var code = editor98329.getSession().getValue();

jQuery("#runBtn98329 i.run-code").show(); jQuery(".output-tab").click();

jQuery.ajax({ url: "https://intellipaat.com/blog/wp-admin/admin-ajax.php", type: "post", data: { language: "python", code: code, cmd_line_args: "", variablenames: "", action:"compilerajax" }, success: function(response) { var resultArray = response.split("~"); var outputData = resultArray[1];

jQuery(".output98329").html("

"+outputData+"");
        jQuery(".maineditor98329 .code-editor-output").show();
        jQuery("#runBtn98329 i.run-code").hide();
    }
});
}

function hideOutput98329() {	
var code = editor98329.getSession().getValue();
jQuery(".maineditor98329 .code-editor-output").hide();
}

// Add event listeners to buttons
document.getElementById("copyBtn98329").addEventListener("click", copyCodeToClipboard98329);
document.getElementById("runBtn98329").addEventListener("click", executeCode98329);
document.getElementById("closeoutputBtn98329").addEventListener("click", hideOutput98329);


Output:

Immutable Types (int, str) - output

Clarification: In this case, the function receives an integer 5. Integers in Python are immutable, and the operation x + 10 within the function's scope generates a new integer object. This illustrates the call-by-value mechanism since the original variable number remains unchanged post function execution.

Illustration 2: Mutable Types (lists, dicts)

This example highlights the mutability of objects like lists and dictionaries, showcasing how modifications can be made in-place, with alterations visible outside the function's confines.

Illustration:

Python
Code Copied!

Output:

```
Mutable Types (lists, dicts) - output

Clarification: In this instance, the list [1, 2, 3] is passed to the function. Since lists are mutable, the append() method alters the original list directly. Consequently, the alteration is observable even after the function invocation, outside of the function's scope, resembling call-by-reference behavior.

Associating Names with Objects in Python

In Python, variable identifiers are merely references (bindings) to objects residing in memory. When you send a variable to a function:

  • A new name (parameter) is established within the function's local context.
  • This new name points to the identical object in memory as the initial variable.
  • As both names target the same object, modifications to mutable entities inside the function will influence the original object externally.
  • Nevertheless, if the parameter is reassigned to a different object within the function, it will only modify the local reference, leaving the original variable untouched.
  • This elucidates why alterations to mutable entities within functions affect the original, while assigning a new object only alters the local reference.

Distinction Between Call by Value and Call by Reference in Python

Characteristic Call by Value Call by Object Reference
Data Transferred A duplication of the actual value is sent A reference to the object is conveyed by value
Ability to Change Data No, modifications within the function do not impact the original Yes, if the object is mutable
Impact on Caller The original variable remains unchanged Mutable objects can be altered; immutables remain the same
Application Utilized to avert unintended side effects Facilitates the modification of immutable objects without duplication
Applicable to Mutable Types A copy of the value is altered without modifying the original Changes made to the object endure outside the function
Applicable to Immutable Types The original variable stays unchanged Rebinding results in a new object; the original remains unchanged

Frequent Errors with Call by Value and Call by Reference in Python

Here are several prevalent errors that developers encounter when passing arguments to functions in Python, often stemming from misconceptions regarding call by value and call by reference.

Error 1: Believing Python Employs Traditional Call by Reference or Call by Value

Many newcomers assume that Python adheres to conventional call by value or call by reference principles, similar to other programming languages. In truth, Python transmits references to objects, rather than duplicates of data. The reference itself is passed by value, enabling mutable objects to be altered within functions. This distinction frequently leads to confusion and difficulties in debugging.

Illustration:

Python
Code Copied!

Output:

```html
Error 1: Presuming Python Utilizes Conventional Call by Reference or Call by Value Semantics - output

Resolution: Understand that Python utilizes a call by object reference, which is frequently termed as the call by assignment approach. This means that these are pointers to actual objects, and binding them in the function does not affect the original object in cases of immutable types such as int, str, or tuple.

Refined Code:

Python
Code Duplicated!

Result:

Presuming Python Utilizes Conventional Call by Reference or Call by Value Semantics - output

Error 2: Altering Immutable Objects with the Expectation of Changes to Persist

Some programmers frequently believe that changing an immutable object within a function will also alter it outside the function.

Illustration:

Python

Code Duplicated!

var isMobile = window.innerWidth ");

editor87311.setValue(decodedContent); // Set the default text editor87311.clearSelection();

editor87311.setOptions({ maxLines: Infinity });

function decodeHTML87311(input) { var doc = new DOMParser().parseFromString(input, "text/html"); return doc.documentElement.textContent; }

// Function to copy code to clipboard function copyCodeToClipboard87311() { const code = editor87311.getValue(); // Get code from the editor navigator.clipboard.writeText(code).then(() => { jQuery(".maineditor87311 .copymessage").show(); setTimeout(function () { jQuery(".maineditor87311 .copymessage").hide(); }, 2000); }).catch(err => { console.error("Error duplicating code: ", err); }); } ``````html { jQuery(".maineditor87311 .copymessage").hide(); }, 2000); }).catch(err => { console.error("An error occurred while copying the code: ", err); }); }

function executeCode87311() {

var sourceCode = editor87311.getSession().getValue();

jQuery("#runBtn87311 i.run-code").show(); jQuery(".output-tab").click();

jQuery.ajax({ url: "https://intellipaat.com/blog/wp-admin/admin-ajax.php", type: "post",

data: { language: "python", code: sourceCode, cmd_line_args: "", variablenames: "", action:"compilerajax" }, success: function(response) { var myArray = response.split("~"); var outputData = myArray[1];

jQuery(".output87311").html("

"+outputData+"");
									jQuery(".maineditor87311 .code-editor-output").show();
									jQuery("#runBtn87311 i.run-code").hide();
									
								}
							})
					

						}
						
						
		function hideOutput87311() {	
		var sourceCode = editor87311.getSession().getValue();
		jQuery(".maineditor87311 .code-editor-output").hide();
		}

    // Link event listeners to the buttons
    document.getElementById("copyBtn87311").addEventListener("click", copyCodeToClipboard87311);
    document.getElementById("runBtn87311").addEventListener("click", executeCode87311);
    document.getElementById("closeoutputBtn87311").addEventListener("click", hideOutput87311);
 
    



Result:

Mistake 2: Modifying Immutable Objects Expecting Changes to Persist - output

Solution: Recognize that strings are immutable in Python. Upon modification, a new string object is generated within the function, while the original remains intact. If you need to return the altered version, ensure it is done explicitly.

Revised Code:

Python
Code Copied!

Result:

Modifying Immutable Objects Expecting Changes to Persist - output

Error 3: Failing to Recognize Mutations on Mutable Objects Impact Original Values

This situation is the converse of the prior error. In this case, developers assume that alterations to mutable objects within a function won't influence the original object, when in actuality they do. Numerous programmers inadvertently modify lists or dictionaries within a function, anticipating the original object to remain the same.

Illustration:

Python
Code Copied! ``````html

"); jQuery(".maineditor43293 .code-editor-output").show(); jQuery("#runBtn43293 i.run-code").hide();

} })

}

function closeoutput43293() { var code = editor43293.getSession().getValue(); jQuery(".maineditor43293 .code-editor-output").hide(); }

// Attach event listeners to the buttons document.getElementById("copyBtn43293").addEventListener("click", copyCodeToClipboard43293); document.getElementById("runBtn43293").addEventListener("click", runCode43293); document.getElementById("closeoutputBtn43293").addEventListener("click", closeoutput43293);

Result:

Error 3: Not Aware that Mutations on Mutable Objects Influence Original Values - result

Solution: Understand that mutable items such as lists and dictionaries will display modifications made within the function. If this is not your intention, create a copy before altering.

Updated Code:

Python

Code Duplicated!

var isMobile = window.innerWidth ");

editor31148.setValue(decodedContent); // Set the initial text editor31148.clearSelection();

editor31148.setOptions({ maxLines: Infinity });

function decodeHTML31148(input) { var doc = new DOMParser().parseFromString(input, "text/html"); return doc.documentElement.textContent; }

// Function to duplicate code to clipboard function copyCodeToClipboard31148() { const code = editor31148.getValue(); // Retrieve code from the editor navigator.clipboard.writeText(code).then(() => { // alert("Code duplicated to clipboard!");

jQuery(".maineditor31148 .copymessage").show(); setTimeout(function() { jQuery(".maineditor31148 .copymessage").hide(); }, 2000); }).catch(err => { console.error("Issue with duplicating code: ", err); }); }

function runCode31148() {

var code = editor31148.getSession().getValue();

jQuery("#runBtn31148 i.run-code").show(); jQuery(".output-tab").click();

jQuery.ajax({ url: "https://intellipaat.com/blog/wp-admin/admin-ajax.php", type: "post",

data: { language: "python", code: code, cmd_line_args: "", variablenames: "", action:"compilerajax" }, success: function(response) { var myArray = response.split("~"); var data = myArray[1];

jQuery(".output31148").html("

"+data+"

"); jQuery(".maineditor31148 .code-editor-output").show(); jQuery("#runBtn31148 i.run-code").hide();

} })

}

function closeoutput31148() { var code = editor31148.getSession().getValue(); jQuery(".maineditor31148 .code-editor-output").hide(); }

// Attach event listeners to the buttons document.getElementById("copyBtn31148").addEventListener("click", copyCodeToClipboard31148); document.getElementById("runBtn31148").addEventListener("click", runCode31148); document.getElementById("closeoutputBtn31148").addEventListener("click", closeoutput31148);


``````javascript
copyCodeToClipboard31148);
document.getElementById("runBtn31148").addEventListener("click", runCode31148);
document.getElementById("closeoutputBtn31148").addEventListener("click", closeoutput31148);

Result:

Not Recognizing Mutations on Mutable Objects Impact Original Values - output

How Memory Structure Influences Function Parameters in Python

To grasp how parameters are processed in Python, it's crucial to understand how Python handles variables in memory. Unlike languages such as C++ or Java, Python does not transmit the precise value or a direct reference. Instead, Python implements call by object reference (also referred to as call by sharing or call by assignment). This implies that both the variable inside the function and the argument external to it direct towards the same object in memory, albeit the reference itself is conveyed as a copy. Whether modifications within the function influence the original data hinges on the object's mutability.

Learn Python for Free: Begin Coding Smarter Today!
Embark on your programming adventure with practical Python tutorials at no cost.
quiz-icon

Summary

Comprehending how Python processes function parameters is vital for crafting clean and dependable code. Python employs a system referred to as call by object reference or call by assignment, in which functions obtain a reference to the object, but the reference itself is passed by value. Consequently, alterations made to mutable objects within a function influence the original data, while reassigning immutable objects does not modify the original variable. This distinction aids you in understanding how your code operates and helps avert unforeseen issues.

Advance your skills by enrolling in the Python Course today and gaining practical experience. Additionally, prepare for job interviews with Python Interview Questions curated by industry experts.

Call by Value and Call by Reference in Python – FAQs

Q1. Does Python utilize call by value or call by reference?

Python implements call by object reference; hence functions receive a reference to the object. Mutable adjustments influence the original, whereas reassigning immutable objects does not change the original.

Q2. Why doesn’t changing a variable within a function impact the original variable?

If a variable refers to an immutable object such as an int, str, or tuple, any modification inside a function generates a new object. The original variable remains unchanged since the function's parameter now points to a disparate object.

Q3. Is it feasible to alter the original list passed as an argument to a function or a dictionary?

Indeed. Lists and dictionaries are mutable entities, and any in-place alteration, such as addition, deletion, or modification of an element, will update the object beyond the scope of the function.

Q4. How can I prevent a mutable argument from being altered by a function?

To avoid modifying the mutable object, pass a copy of it instead (e.g., list.copy() or dict.copy()) and work with that copy within the function.

Q5. Why does Python seem to function as both call by value and call by reference?

In Python, immutable types behave like call by value while mutable types imitate call by reference. This is a result of Python's call by object reference model, where conduct is contingent on mutability.

The article Call by Value and Call by Reference in Python first appeared on Intellipaat Blog.

```


Leave a Reply

Your email address will not be published. Required fields are marked *

Share This