شناسهٔ یکتای هر شیء در حافظه (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
اشتباه رایج
آرگومان تابع همیشه کپی میشود پس تابع نمیتواند ورودی را خراب کند.
تصحیح
پایتون ارجاع را پاس میدهد: شیء جهشپذیرِ ورودی از داخل تابع قابل تغییر است. اگر نباید عوض شود، همان اول کپی بگیر یا قرارداد تابع را مستند کن.