Bu gibi karışıklıklar nedeniyle ilk etapta global değişkenleri kullanmaktan kaçınmam gerektiğini biliyorum, ancak bunları kullanacak olsaydım, aşağıdakiler bunları kullanmak için geçerli bir yol mudur? (Ayrı bir fonksiyonda oluşturulan bir değişkenin global kopyasını çağırmaya çalışıyorum)
x = "somevalue"
def func_A ():
global x
# Do things to x
return x
def func_B():
x=func_A()
# Do things
return x
func_A()
func_B()
İkinci fonksiyonun kullandığı 'x', 'func_a''nın kullandığı ve değiştirdiği 'x''in global kopyasıyla aynı değere sahip mi? Tanımlamadan sonra fonksiyonları çağırırken sıra önemli midir?
Bir global değişkene basitçe erişmek istiyorsanız, sadece adını kullanırsınız. Ancak değerini değiştirmek için global
anahtar sözcüğünü kullanmanız gerekir.
Örneğin.
global someVar
someVar = 55
Bu, global değişkenin değerini 55 olarak değiştirecektir. Aksi takdirde 55 değerini yerel bir değişkene atar.
Fonksiyon tanım listelerinin sırası önemli değildir (bir şekilde birbirlerine atıfta bulunmadıkları varsayılırsa), çağrılma sıraları önemlidir.
Diğerlerinin de belirttiği gibi, bir fonksiyonun global değişkeni değiştirebilmesini istediğinizde, bir fonksiyonda global
değişken bildirmeniz gerekir. Eğer sadece erişmek istiyorsanız, o zaman global
değişkenine ihtiyacınız yoktur.
Bu konuda biraz daha ayrıntıya girmek gerekirse, "modify" şu anlama gelir: global ismi farklı bir nesneye işaret edecek şekilde yeniden bağlamak istiyorsanız, isim fonksiyon içinde global
olarak bildirilmelidir.
Bir nesneyi değiştiren (mutasyona uğratan) birçok işlem global adı farklı bir nesneye işaret edecek şekilde yeniden bağlamaz ve bu nedenle işlevde global
adını bildirmeden hepsi geçerlidir.
d = {}
l = []
o = type("object", (object,), {})()
def valid(): # these are all valid without declaring any names global!
d[0] = 1 # changes what's in d, but d still points to the same object
d[0] += 1 # ditto
d.clear() # ditto! d is now empty but it`s still the same object!
l.append(0) # l is still the same list but has an additional member
o.test = 1 # creating new attribute on o, but o is still the same object
Global bir değişkene atanan değeri değiştirmek istediğinizde global
bildirimini kullanmanız gerekir.
Global bir değişkenden okumak için buna ihtiyacınız yoktur. Bir nesne üzerinde bir yöntem çağırmanın (o nesne içindeki verileri değiştirse bile) o nesneyi tutan değişkenin değerini değiştirmediğini unutmayın (yansıtıcı sihir olmadan).