رفتن به محتوای اصلی
برنامه‌سازی پیشرفته با پایتون درس‌نامهٔ آزاد
مفهوم مقدماتی ۸ دقیقه

جهش‌پذیری و هویت شیء

ارجاع، هویت و جهش‌پذیری: چرا b = a کپی نمی‌سازد و is با == چه فرقی دارد.

تعریف هویت شیء

شناسهٔ یکتای هر شیء در حافظه (id())؛ دو نام با هویت یکسان، به یک شیء اشاره می‌کنند.

a = [1, 2]
b = a
c = [1, 2]
print(a == b, a is b)  # True True — یک شیء
print(a == c, a is c)  # True False — دو شیء برابر ولی جدا

== برابریِ مقدار را می‌پرسد و is یکی‌بودنِ هویت را. برای مقایسهٔ مقدار همیشه ==؛ is فقط برای تک‌نمونه‌ها مثل None (x is None).

جهش‌پذیرها (list، dict، set) از طریق هر ارجاع عوض می‌شوند؛ جهش‌ناپذیرها (int، str، tuple) هر «تغییر» را با شیء تازه جواب می‌دهند:

def append_star(items):
    items.append("*")  # روی شیء ورودی اثر می‌گذارد!
    return items
برداشت نادرست رایج

اشتباه رایج

آرگومان تابع همیشه کپی می‌شود پس تابع نمی‌تواند ورودی را خراب کند.

تصحیح

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

مطالب مرتبط

از همین بخش و با برچسب‌های مشترک

این مطلب را خواندید؟ آن را علامت بزنید تا پیشرفت شما روی همین دستگاه ذخیره شود.

وضعیت پیشرفت برای جهش‌پذیری و هویت شیء