آموزش پایتون - کپی لیست

کپی کردن یک لیست در پایتون

کپی کردن یک لیست در پایتون به معنای ایجاد یک لیست جدید است که همان عناصر لیست اصلی را در خود دارد. روش‌های مختلفی برای کپی کردن یک لیست وجود دارد؛ از جمله استفاده از نماد برش (Slice Notation)، تابع list() و متد copy().

هر یک از این روش‌ها از نظر ایجاد کپی سطحی یا کپی عمیق رفتار متفاوتی دارند. در این آموزش، تمام این روش‌ها را به‌طور کامل بررسی می‌کنیم.

کپی سطحی در یک لیست پایتون

کپی سطحی در پایتون یک شیء جدید ایجاد می‌کند، اما به‌جای کپی کردن بازگشتی عناصر، فقط ارجاع‌های مربوط به عناصر اصلی را کپی می‌کند. این یعنی شیء جدید از شیء اصلی جداست، اما اگر خود عناصر تغییرپذیر باشند، تغییراتی که در عناصر شیء جدید ایجاد می‌کنید، بر شیء اصلی نیز تأثیر می‌گذارند.

مثالی از کپی سطحی

بیایید این موضوع را با مثال زیر بررسی کنیم:

import copy
# Original list
original_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# Creating a shallow copy
shallow_copied_list = copy.copy(original_list)
# Modifying an element in the shallow copied list
shallow_copied_list[0][0] = 100
# Printing both lists
print("Original List:", original_list)
print("Shallow Copied List:", shallow_copied_list)

همان‌طور که می‌بینید، با اینکه فقط اولین عنصر از اولین زیرفهرست در لیست کپی‌شده به روش سطحی را تغییر دادیم، همین تغییر در لیست اصلی نیز مشاهده می‌شود.

دلیل این موضوع آن است که کپی سطحی فقط ارجاع‌های جدیدی به اشیای اصلی ایجاد می‌کند، نه اینکه خود آن اشیا را کپی کند:

Original List: [[100, 2, 3], [4, 5, 6], [7, 8, 9]]
Shallow Copied List: [[100, 2, 3], [4, 5, 6], [7, 8, 9]]

کپی عمیق در یک لیست پایتون

کپی عمیق در پایتون یک شیء کاملاً جدید ایجاد می‌کند و تمام اشیایی را که شیء اصلی به آن‌ها ارجاع دارد، به‌صورت بازگشتی کپی می‌کند. این یعنی حتی اشیای تو‌در‌توی موجود در شیء اصلی نیز تکثیر می‌شوند. در نتیجه، یک کپی کاملاً مستقل ایجاد می‌شود که تغییرات اعمال‌شده روی شیء کپی‌شده بر شیء اصلی تأثیری ندارند و برعکس.

مثالی از کپی عمیق

بیایید این موضوع را با مثال زیر بررسی کنیم:

import copy
# Original list
original_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# Creating a deep copy
deep_copied_list = copy.deepcopy(original_list)
# Modifying an element in the deep copied list
deep_copied_list[0][0] = 100
# Printing both lists
print("Original List:", original_list)
print("Deep Copied List:", deep_copied_list)

همان‌طور که می‌بینید، وقتی اولین عنصر از اولین زیرفهرست در لیست کپی‌شده به روش عمیق را تغییر می‌دهیم، تغییری در لیست اصلی ایجاد نمی‌شود.

دلیل این موضوع آن است که کپی عمیق یک شیء جدید ایجاد می‌کند و تمام اشیای تو‌در‌تو را به‌صورت بازگشتی کپی می‌کند. به این ترتیب، شیء کپی‌شده کاملاً مستقل از شیء اصلی خواهد بود:

Original List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Deep Copied List: [[100, 2, 3], [4, 5, 6], [7, 8, 9]]

کپی کردن لیست با استفاده از نماد برش

نماد برش (Slice Notation) در پایتون به شما امکان می‌دهد با مشخص کردن اندیس شروع، اندیس پایان و اندازه گام اختیاری، دنباله‌ای از عناصر یک توالی مانند لیست، تاپل یا رشته ایجاد کنید. ساختار نوشتاری نماد برش به این صورت است:

[start:end:step]

در این ساختار، start اندیسی است که برش از آن آغاز می‌شود، end اندیسی است که برش در آن پایان می‌یابد (اما خود این اندیس در برش گنجانده نمی‌شود) و step اندازه گام بین عناصر را مشخص می‌کند.

برای کپی کردن یک لیست با استفاده از نماد برش، می‌توانیم کل محدوده اندیس‌های لیست اصلی را مشخص کنیم. این کار در عمل یک لیست جدید با همان عناصر لیست اصلی ایجاد می‌کند.

تغییراتی که در لیست کپی‌شده ایجاد می‌شوند، بر لیست اصلی تأثیری ندارند و برعکس؛ زیرا این دو، اشیای جداگانه‌ای در حافظه هستند.

مثال

در این مثال، از لیست «original_list» یک برش ایجاد می‌کنیم و به این ترتیب، تمام عناصر آن را در یک لیست جدید به نام «copied_list» کپی می‌کنیم:

# Original list
original_list = [1, 2, 3, 4, 5]
# Copying the list using slice notation
copied_list = original_list[1:4]
# Modifying the copied list
copied_list[0] = 100
# Printing both lists
print("Original List:", original_list)
print("Copied List:", copied_list)

نتیجه به‌صورت زیر خواهد بود:

Original List: [1, 2, 3, 4, 5]
Copied List: [100, 3, 4]

کپی کردن لیست با استفاده از تابع list()

تابع list() در پایتون، تابعی داخلی است که برای ایجاد یک شیء لیست جدید استفاده می‌شود. این تابع می‌تواند یک شیء تکرارپذیر، مانند لیست دیگر، تاپل یا مجموعه (Set) را به‌عنوان آرگومان دریافت کند و لیست جدیدی حاوی عناصر آن شیء بسازد. اگر هیچ آرگومانی به آن داده نشود، یک لیست خالی ایجاد می‌شود.

برای کپی کردن یک لیست با استفاده از تابع list()، کافی است لیست اصلی را به‌عنوان آرگومان به آن بدهیم. در نتیجه، یک شیء لیست جدید ایجاد می‌شود که همان عناصر لیست اصلی را در خود دارد.

مثال

در مثال زیر، با استفاده از تابع list() یک شیء لیست جدید به نام «copied_list» ایجاد می‌کنیم که همان عناصر «original_list» را در خود دارد:

# Original list
original_list = [1, 2, 3, 4, 5]
# Copying the list using the list() constructor
copied_list = list(original_list)
# Printing both lists
print("Original List:", original_list)
print("Copied List:", copied_list)

خروجی کد بالا به این صورت است:

Original List: [1, 2, 3, 4, 5]
Copied List: [1, 2, 3, 4, 5]

کپی کردن لیست با استفاده از تابع copy()

در پایتون، تابع copy() برای ایجاد یک کپی سطحی از لیست یا سایر اشیای تغییرپذیر استفاده می‌شود. این تابع بخشی از ماژول copy در کتابخانه استاندارد پایتون است.

برای کپی کردن یک لیست با استفاده از تابع copy()، آن را روی لیست اصلی فراخوانی می‌کنیم. این کار یک شیء لیست جدید ایجاد می‌کند که همان عناصر لیست اصلی را در خود دارد.

مثال

در مثال زیر، از تابع copy() برای ایجاد یک شیء لیست جدید به نام «copied_list» استفاده می‌کنیم که همان عناصر «original_list» را در خود دارد:

import copy
original_list = [1, 2, 3, 4, 5]
# Copying the list using the copy() function
copied_list = copy.copy(original_list)
print("Copied List:", copied_list)

خروجی کد بالا به این صورت است:

Copied List: [1, 2, 3, 4, 5]

پیشرفت مطالعه: وضعیت خوانده‌شدن این درس فقط در همین مرورگر ذخیره می‌شود؛ بدون نیاز به حساب کاربری.