ProgramlamaBackend Geliştirici

Python, string (str) işlemlerini nasıl gerçekleştirir? Python'daki stringlerin değişmezliği, örneğin listelerden neyle farkıdır? Büyük veri kümeleri üzerinde çalışırken stringlerle yapılan işlemlerde hangi ince noktalar vardır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

Python'da stringler (str) değişmez nesnelerdir, yani oluşturulduktan sonra içerikleri değiştirilemez. Stringi değiştiren herhangi bir işlem (örneğin, birleştirme veya karakter değiştirme) yeni bir string nesnesi oluşturur. Bu, çalışma sırasında güvenlik ve öngörülebilirlik sağlar, çünkü başka bir yerde kodda birinin stringi gizlice değiştirmesinden endişelenmenize gerek kalmaz.

s = 'Hello' s2 = s.replace('H', 'J') # s 'Hello' kalır, s2 'Jello' olur

Stringlerden farklı olarak, Python'daki listeler değiştirilebilir nesnelerdir. İçerikleri indeksleme veya yöntemler aracılığıyla yerinde değiştirilebilir, bu da bazen aynı listenin farklı yerlerde kullanılması durumunda gizli etkilere yol açar.

Performans açısından: Eğer büyük stringleri sık sık değiştirmek gerekiyorsa (örneğin bir döngü içinde), değişmezlik mekanizması fazla bellek tahsisine ve kodun yavaş çalışmasına yol açabilir. Bu tür durumlarda, string parçalarını biriktirmek için liste kullanılması ve ardından ''.join() ile birleştirilmesi önerilir.

Örnek:

# Kötü (büyük veri kümeleri için yavaş): s = '' for word in words: s += word # Her adımda yeni bir string oluşturulur # İyi: parts = [] for word in words: parts.append(word) s = ''.join(parts)

Kandırmacalı Soru

Soru: Neden "s += 'abc'" kodu "s = s + 'abc'" kodundan daha hızlıdır?

Cevap: Bu tür sorular, kişinin her iki işlemin aslında stringler için eşdeğer olduğunu anlayıp anlamadığını test etmek için sorulur (s += 'abc' yeni bir nesne yaratır, tıpkı s = s + 'abc' gibi) — Python'daki türlerin davranışı böyle düzenlenmiştir. Listelerdeki davranış farklıdır; çünkü list += [...] nesne üzerinde değişiklik yapar, ancak list = list + [...] yeni bir nesne oluşturur. Stringler için her zaman yeni bir string oluşturulur.

s = 'hi' s += 'abc' # Yeni nesne, orijinal string değişmez def compare(s): a = s a += 'abc' # id(a) != id(s) <-- bellek içindeki nesneler farklı

Bilinçsizliği nedeniyle oluşan gerçek hata örnekleri


Hikaye

Büyük logların işlenmesinin gerektiği bir projede, geliştirici döngü içinde stringleri naif bir şekilde birleştirdi. Sonuç — devasa performans düşüşleri ve bellek tüketiminde hızlı bir artış. Liste ve join() yöntemi ile optimize edildikten sonra, çalışma süresi 20 kat azaldı.


Hikaye

Bir projede, bir karakteri bir indeksten "düzeltmeye" çalışırken, programcı orijinal stringde bir değişiklik göreceğini bekliyordu. TypeError: 'str' object does not support item assignment hatası meydana geldi. Birkaç saat harcadıktan sonra, hata ayıklayıcı yeni bir string oluşturmak ve gerekli karakteri değiştirmek için dilimleme kullanmak zorunda kaldı.


Hikaye

Stringleri bir fonksiyona "tamamlamak" (örneğin, her bir liste elemanına bir ek eklemek) için geçerken, geliştiricilerden biri stringin "yerinde" değişeceğini bekliyordu. Sonuç — fonksiyon None döndürdü (return olmadığı için) ve tüm stringler orijinal halinde kaldı.