2015-06-20 9 views
13

Python, tüm global değişkenlerin sözlüğüne erişmek için globals() işlevini sunar. Neden bu bir işlev ve değişken değil? Aşağıdaki işler:Neden globals() Python'da bir işlevdir?

g = globals() 
g["foo"] = "bar" 
print foo # Works and outputs "bar" 

Bir işlevde gizlenen globals ardındaki mantık nedir? Ve sadece bir kez çağırmak ve bir yerde bir referansı saklamak daha mı yoksa ihtiyacım olan her seferinde mi çağırmalıyım? globals() mevcut neden sormuyorum çünkü

IMHO, bu, Reason for globals() in Python? kopyası olmaktan ziyade neden (yerine değişken __globals__ ait) bir fonksiyon olmalıdır.

+1

Hata ayıklama dışında her zaman globals'a erişmeniz gerekir; bu, ilgili http://stackoverflow.com/questions/12693606/reason-for-globals-in-python –

+0

daha sonra, kullanışlı alanı kullanarak sanal bellekte saklanırdı. Bir işlev olarak, gerçekten ihtiyacınız olduğunda (ve her zaman değil) bu bilgileri saklamanızı sağlar. Fonksiyonun global değişkenleri araştırdığını ve aradığını tahmin ediyorum. Yani eğer onu çağırmazsan, fazladan hafıza kullanılmaz ... Bütün bunlardan emin değilim, sadece benim varsayım. – tomasyany

+0

Bence bu soruyu cevaplamak belirli bir tarihsel bilgi gerektirecektir, ancak 'yerlilerin' bir işlev olması gerektiğinden (çağrıldığında dict'i güncellemesi gerekir), 'globals'ın' yerlilerle simetri için bir işlev yapıldığından şüpheleniyorum. – user2357112

cevap

17

Bu, Python uygulamasının sözlüğüne bağlı olarak ne kadar çalışacağına bağlı olabileceğinden.

CPython'da, globals yalnızca başka bir eşlemede tutulur ve globals() işlevini çağırmak bu eşleştirmeye bir başvuru döndürür. Ancak diğer Python uygulamaları, gerektiğinde, gerektiğinde nesne için ayrı bir sözlük oluşturmakta özgürdür.

Bu, CPython'da istek üzerine bir sözlük oluşturmak zorunda olduğu locals() işlevini yansıtır çünkü yereller normalde bir dizide depolanır (yerel adlar, CPython baytkodunda dizi erişimine dönüştürülür). Genel adların eşleştirilmesine erişmeniz gerektiğinde, globals() numaralı telefonu arayabilirdiniz. Bu eşleştirmeye bir referansın saklanması, CPython'da çalışır, ancak diğer uygulamalarda buna güvenmeyin.

+1

Diğer Python uygulamalarını destekleyenler, "globals" piyasaya sunulduğunda bile endişe duyuyor muydu? – user2357112

+2

@ user2357112: Ben öyle düşünmüyorum, ama bence bu, globals'un içsel uygulamasını varsayımlardan uzak tutmak önemliydi. –

+0

"Globals() [" foo "] = 'bar' 'belgesine güvenebileceğimi düşünüyor musunuz? –

İlgili konular