چرا متود copy همیشه کپی واقعی نمیسازه؟
یکی از باگهایی که حتی برنامهنویسهای با تجربه هم گاهی باهاش روبهرو میشن، تفاوت بین Copy و Deep Copy هست
فرض کنید این لیست رو داریم:
data = [
["Yasin", "Ali"],
["Math", "Science"]
]
حالا ازش کپی میگیریم:
new_data = data.copy()
خیلیها فکر میکنن new_data کاملاً مستقل از data شده اما اینطور نیست
اگر این کار رو انجام بدیم:
new_data[0].append("Sina")
نتیجه:
print(data)
# خروجی 👇🏻
# [['Yasin', 'Ali', 'Sina'], ['Math', 'Science']]
چرا لیست اصلی هم تغییر کرد؟
چون copy() فقط لیست بیرونی رو کپی میکنه، ولی عناصر داخلش همچنان به همون آبجکتهای قبلی اشاره میکنن.
به این میگن Shallow Copy
-——————————————--
🎈اما راه حل؟
وقتی ساختارهای تو در تو دارید با از از deepcopy استفاده کنید
from copy import deepcopy
new_data = deepcopy(data)
حالا هر تغییری روی new_data بدید روی data اثری نداره
🔴 نکته مهم 🔴
اگر دادههای شما تو در تو نیستند، copy کاملاً کافی و سریعتره
اما اگر با لیست، دیکشنری یا آبجکتهای تو در تو کار میکنید استفاده اشتباه از copy میتونه باگ ایجاد کنه که وقتتون گرفته بشه
🔖 #Python #پایتون
👤 BʟᴀᴄᴋCᴀᴛ
💎 Channel: @DevelopixPython
یکی از باگهایی که حتی برنامهنویسهای با تجربه هم گاهی باهاش روبهرو میشن، تفاوت بین Copy و Deep Copy هست
فرض کنید این لیست رو داریم:
data = [
["Yasin", "Ali"],
["Math", "Science"]
]
حالا ازش کپی میگیریم:
new_data = data.copy()
خیلیها فکر میکنن new_data کاملاً مستقل از data شده اما اینطور نیست
اگر این کار رو انجام بدیم:
new_data[0].append("Sina")
نتیجه:
print(data)
# خروجی 👇🏻
# [['Yasin', 'Ali', 'Sina'], ['Math', 'Science']]
چرا لیست اصلی هم تغییر کرد؟
چون copy() فقط لیست بیرونی رو کپی میکنه، ولی عناصر داخلش همچنان به همون آبجکتهای قبلی اشاره میکنن.
به این میگن Shallow Copy
-——————————————--
🎈اما راه حل؟
وقتی ساختارهای تو در تو دارید با از از deepcopy استفاده کنید
from copy import deepcopy
new_data = deepcopy(data)
حالا هر تغییری روی new_data بدید روی data اثری نداره
🔴 نکته مهم 🔴
اگر دادههای شما تو در تو نیستند، copy کاملاً کافی و سریعتره
اما اگر با لیست، دیکشنری یا آبجکتهای تو در تو کار میکنید استفاده اشتباه از copy میتونه باگ ایجاد کنه که وقتتون گرفته بشه
🔖 #Python #پایتون
👤 BʟᴀᴄᴋCᴀᴛ
💎 Channel: @DevelopixPython
👍9❤3🔥2
خیلی وقتها پوشه Downloads شبیه یک انباری شلوغ میشود؛ pdf، عکس، zip، هر چیزی قاطی هم 😅
امروز یک اسکریپت واقعی و ساده با Python میسازیم که فایلها را بر اساس نوع، به پوشههای جدا منتقل کند.
ایده از این آموزش الهام گرفته شده:
Real Python - Working With Files in Python
🧠 ایده کلی
Python برای کار با فایلها و مسیرها کتابخانههای خیلی خوبی دارد، مخصوصاً
کاری که میکنیم:
- پوشه Downloads را مانیتور نمیکنیم، فقط هر بار اسکریپت را اجرا کنیم
- بر اساس پسوند فایل (مثلاً .pdf یا .jpg) تصمیم میگیریم کجا برود
- اگر پوشه مقصد وجود نداشت، خودمان میسازیم
این مدل اسکریپتها برای مرتب نگهداشتن سیستم شخصی یا سیستمهای روی سرور خیلی کاربردی است.
🛠 کتابخانههای مورد نیاز
همه چیز با کتابخانههای استاندارد Python انجام میشود:
-
-
-
📦 کد نمونه: مرتبسازی فایلها بر اساس پسوند
این یک مثال ساده و عملی است. مسیر
نکات کوچک اما مهم ✨
- قبل از اجرا، یکبار روی یک پوشه تستی امتحان شود تا مطمئن شوید مپ پسوندها را درست تعریف کردهاید.
- میتوانید
- اگر با Windows کار میکنید و مسیر Downloads فرق دارد، از
چطور حرفهایترش کنیم؟
- اضافه کردن
- ساختن یک CLI ساده با کتابخانه
- زمانبندی اجرای اسکریپت (مثلاً با Task Scheduler روی Windows یا cron روی Linux).
اگر پوشه Downloads شما همیشه شلوغ است، این اسکریپت یک نجاتدهنده کوچک است 😄
امتحانش کنید و اگر دوست داشتید، با بقیه توسعهدهندگان پایتون هم به اشتراک بگذارید.
🔖 #Python #پایتون #Python #Automation #Files #pathlib #shutil #Scripting
👤 Developix
💎 Channel: @DevelopixPython
امروز یک اسکریپت واقعی و ساده با Python میسازیم که فایلها را بر اساس نوع، به پوشههای جدا منتقل کند.
ایده از این آموزش الهام گرفته شده:
Real Python - Working With Files in Python
🧠 ایده کلی
Python برای کار با فایلها و مسیرها کتابخانههای خیلی خوبی دارد، مخصوصاً
pathlib و shutil.کاری که میکنیم:
- پوشه Downloads را مانیتور نمیکنیم، فقط هر بار اسکریپت را اجرا کنیم
- بر اساس پسوند فایل (مثلاً .pdf یا .jpg) تصمیم میگیریم کجا برود
- اگر پوشه مقصد وجود نداشت، خودمان میسازیم
این مدل اسکریپتها برای مرتب نگهداشتن سیستم شخصی یا سیستمهای روی سرور خیلی کاربردی است.
🛠 کتابخانههای مورد نیاز
همه چیز با کتابخانههای استاندارد Python انجام میشود:
-
pathlib برای کار راحتتر با مسیرها-
shutil برای جابجا کردن فایلها-
os اگر خواستیم تنظیمات خاصتری انجام بدهیم (اینجا خیلی کم استفاده میشود)📦 کد نمونه: مرتبسازی فایلها بر اساس پسوند
این یک مثال ساده و عملی است. مسیر
DOWNLOADS_PATH را با مسیر سیستم خودتان عوض کنید 👇from pathlib import Path
import shutil
# مسیر پوشه Downloads را مطابق سیستم خود تنظیم کنید
DOWNLOADS_PATH = Path.home() / "Downloads"
# مپ کردن پسوندها به پوشههای هدف
EXTENSION_MAP = {
".pdf": "PDFs",
".jpg": "Images",
".jpeg": "Images",
".png": "Images",
".zip": "Archives",
".rar": "Archives",
".mp4": "Videos",
".mp3": "Music",
}
for item in DOWNLOADS_PATH.iterdir():
if item.is_file():
ext = item.suffix.lower()
if ext in EXTENSION_MAP:
target_dir = DOWNLOADS_PATH / EXTENSION_MAP[ext]
target_dir.mkdir(exist_ok=True)
target_path = target_dir / item.name
# اگر فایلی با همین نام هست، نام را کمی عوض میکنیم
if target_path.exists():
target_path = target_dir / f"{item.stem}_copy{ext}"
shutil.move(str(item), str(target_path))
نکات کوچک اما مهم ✨
- قبل از اجرا، یکبار روی یک پوشه تستی امتحان شود تا مطمئن شوید مپ پسوندها را درست تعریف کردهاید.
- میتوانید
EXTENSION_MAP را مطابق نیاز خود بزرگتر کنید (مثلاً برای فایلهای .pptx، .csv و غیره).- اگر با Windows کار میکنید و مسیر Downloads فرق دارد، از
print(Path.home()) استفاده کنید تا مسیر خانه کاربر را ببینید.چطور حرفهایترش کنیم؟
- اضافه کردن
logging برای لاگ کردن کارهایی که روی فایلها انجام میشود.- ساختن یک CLI ساده با کتابخانه
argparse تا بشود مسیر را از طریق command line داد.- زمانبندی اجرای اسکریپت (مثلاً با Task Scheduler روی Windows یا cron روی Linux).
اگر پوشه Downloads شما همیشه شلوغ است، این اسکریپت یک نجاتدهنده کوچک است 😄
امتحانش کنید و اگر دوست داشتید، با بقیه توسعهدهندگان پایتون هم به اشتراک بگذارید.
🔖 #Python #پایتون #Python #Automation #Files #pathlib #shutil #Scripting
👤 Developix
💎 Channel: @DevelopixPython
👍5❤4🔥1