Belgelerde Değiştirilemeyen Nesne Sorunu

Python Belgelerde diyor ki : “karakter dizileri gibi değiştirilemeyen nesneleri, lokal isim alanlarında
değiştiremeyeceğiniz gibi, yeniden tanımlayamazsınız da…” . Peki ;

x = "5"              #karakter dizisi değiştirilemeyen bir veri tipidir.
def fon() :
    x = "b"           
    return x 
print(fonk()) 

Burada "yeniden tanımlanamaz "denilen nesne (x) yeniden tanımlanmış olmuyor mu ?
x global olarak 5 ’ ti ve karakter dizisi olarak değiştirilemeyen veri tipi olduğu için değiştirilemeyen ve lokal alanda yeniden tanımlanamayan bir nesne idi fakat yukarıdaki kodda yeniden tanımlanmış olmaz mı ? , x in id() fonksiyonunda baktığımızda aynı olmadığı biliyorum fakat yukarıdaki kod yeniden tanımlama kapsamına girmez mi ?

Yeniden tanımlanamıyor diyemeyiz, ama değiştirilemiyor diyebiliriz.

x = "a"


def f():
    x += "b"


f()

Bu kodları çalıştırırsak alacağımız hata şöyle olacaktır:

UnboundLocalError: local variable 'x' referenced before assignment

Bunu önlemek için fonksiyonun içindeki x'in, global x olduğunu belirtmeliyiz.

x = "a"


def f():
    global x
    x += "b"


f()
1 Beğeni

O halde belgelerde o kısım yanlış yazılmış öyle değil mi ?

Hangi sayfada bu yazılar bir bakalım veya o sayfadaki yazıları buraya aktarabilir misiniz?

2 Beğeni

İlgili kısım ;
Ama eğer bir nesne değiştirilemez bir nesne ise, o nesnenin değerini zaten normalde
de değiştiremezsiniz. Değiştirmiş gibi yapmak için ise o nesneyi yeniden tanımlamanız
gerektiğini biliyorsunuz:

isim = 'fırat'
isim+= 'özgül'
print(isim)
>>> fırat özgül 
Burada yaptığımız şey, karakter dizisinin değerini değiştirmekten ziyade bu karakter dizisini
yeniden tanımlamaktır. Çünkü bildiğiniz gibi karakter dizileri değiştirilemeyen veri tipleridir.
İşte karakter dizileri gibi değiştirilemeyen nesneleri, lokal isim alanlarında
değiştiremeyeceğiniz gibi, yeniden tanımlayamazsınız da...
isim = 'Fırat'
def fonk():
    isim += ' Özgül'
    return isim
print(fonk())
Bu kodları çalıştırdığınızda Python size bir hata mesajı gösterecektir.




Evet orada bir hata yapılmış.

1 Beğeni

Link verebilirmisiniz?

isim_listesi = []
def fonk():
    isim_listesi += ['Fırat Özgül', 'Orçun Kunek']
    return isim_listesi
print(fonk())
Değiştirilebilen bir veri tipi olan listeleri, fonksiyon içinde yeniden tanımlayamazsınız. Ancak
tabii isterseniz listeleri değişikliğe uğratabilirsiniz:

Yalnız aynı şey hemen bir sonraki sayfada da yapılmış acaba biz yanlış mı düşünüyoruz ? Aynı hata 2 farklı yerde de yapılması normal gelmedi bana . Fonksiyon içinde yeniden tanımlayamazsınız diyor ama yeniden tanımlayabiliyorum .
mesela ;

isim_listesi = []
def fonk():
    isim_listesi = "b"
    return isim_listesi
print(fonk())

burada listeyi karakter dizisi olarak fonksiyon içinde tanımlayabiliyorum . Oysa yazılana göre tanımlayamıyor olmam lazımdı .Listeyi değişikliğe uğratabilirsiniz diyor çünkü liste veri tipi değiştirilebilir burada sorun yok listeye ekleme çıkarma yapabiliyorum fonksiyon içinde fakat yeniden tanımlanamaz diyor orasını anlamadım . Oysa yukarıdaki kodda tanımladım yeniden karakter dizisi olarak .

Buradan da ulaşabilirsiniz : https://python-istihza.yazbel.com/fonksiyonlar.html#fonksiyonlarin-kapsami-ve-global-deyimi