2016-04-14 15 views
3

Örnek 1 dosyasına .py zaman:Python farklı bellek yönetimi davranışları Python kabuğunda çalıştırmak ve *

➜ /tmp cat t.py 
a = 250000000000 
b = 250000000000 
print id(a), id(b), id(a) == id(b) 
➜ /tmp python t.py 
140450848587992 140450848587992 True #(Why is True?) 

Örnek 2:

➜ /tmp python 
Python 2.7.10 (default, Oct 23 2015, 19:19:21) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> a = 250000000000 
>>> b = 250000000000 
>>> print id(a), id(b), id(a) == id(b) 
140443481339400 140443481339208 False #(I think it should be False) 

Python dan (küçük bir tamsayı önbellek havuz var - 5 ila 256), bu yüzden iki büyük tamsayı her zaman farklı bir kimliğe sahip olmalıdır.

Python kabuğu ve * .py dosyasında çalıştırıldığında büyük tamsayıların farklı davranışları nasıl açıklanır?

cevap

3

Python yorumlayıcısı, .py dosyasını (ilk örneğinizde olduğu gibi) okuyor olsaydım, bu numara için yalnızca bir kez bellek ayırır ve bu konuma a ve b işaretini yapardım.

Örneğin, yorumlayıcı bu dosyayı okur ve iki değişkene aynı değeri atar ve düşünür: "Aynı değer için iki parçayı ayırarak belleği boşa harcamak ister miyim? Hayır, yok." Tek bir parçayı daha iyi tahsis edip bu değeri sakladım. " Yani, bu değerin yalnızca bir kopyası var ve bu yüzden bu değişkenlerin aynı kimlikleri var.

Python Eğer atama yaptığınızda bellek ayırmaya sahiptir İkinci durumda

, bu nedenle aynı verilerle bellek iki parça vardır.

yorumlayıcı kodu (tüm kod verilir) hakkında çok fazla bilen birinci durumda, Özetle, bu nedenle can optimize o (ve .pyo dosyaları oluşturmak) ise ikinci birinde basitçe can' Herhangi bir optimizasyon yapmayın.

-
2

Aslında, CPython çalışma zamanı aslında bir "değişmez" (önbellek), bazı değişmez nesneler (belirli bir değere kadar ints, yasal python tanımlayıcıları olabilen dizeler vb.) Optimizasyon olarak kullanılır. Tüm bu davranışlar tamamen uygulamaya bağlıdır ve hiç fark etmediğiniz gibi, hiçbir durumda güvenilmemelidir.

+0

Teşekkürler, şimdi bu davranışın tamamen uygulamaya bağlı olduğunu biliyorum! – virusdefender