2016-03-04 13 views
11

Python 3.5'de, dahili bir dizeyi ne zaman alacağımızı veya bir kopyasını alacağımızı tahmin etmek mümkün mü? Bu konuda birkaç Yığın Taşması yanıtlarını okuduktan sonra, en yararlı ancak hala kapsamlı olmamakla birlikte this one'u buldum. Ben Python docs baktım ama stajyerlikCpython'un dizgisinin internasyonu için kurallar nelerdir?

Normalde, Python programlarında kullanılan adları otomatik enterne edilmiştir varsayılan olarak garanti ve sözlükleri modül, sınıf veya örnek nitelikleri staj bekletmeyi kullanılmaz Daha anahtarlar.

Yani, sorum iç intern() koşullar, yani karar verme hakkındadır (literal veya olmasın stajyer dize verip): kodun aynı parça değil, başka biri üzerinde ve kurallar ne yaptığını yazar bir sistem üzerinde çalışıyor neden

derken mentioned topic üzerine cevabın bu olduğunda kuralları oldukça dolambaçlı olduğu anlamına

sana bağlantılı görevinden anlaşılan kadarıyla
+0

Sadece == 'kullanın ve unutun. Yine de uygulama detayı. – wim

+3

@erip OP'nin bunun farkında olduğuna inanıyorum. Boiler levhadan geçtikten sonra, bu soru internetteki kuralları soruyor gibi görünüyor. – timgeb

+1

Gerçekten uygulamadaki farklılıkları bilmek istiyorsanız, her iki sistemde kurulu olan Python sürümlerini belirtmeniz mantıklı olacaktır. –

cevap

3

kuralları var mı?

İç içe geçirmenin tek kuralı, intern dönüş değerinin iç içe olmasıdır. Diğer her şey, bir parça kodun kararlaştırdığı ya da yapmamaya karar vermesi gereken kişilere aittir. Örneğin, "left"PyCodeNew tarafından enterne alır:

/* Intern selected string constants */ 
for (i = PyTuple_GET_SIZE(consts); --i >= 0;) { 
    PyObject *v = PyTuple_GetItem(consts, i); 
    if (!all_name_chars(v)) 
     continue; 
    PyUnicode_InternInPlace(&PyTuple_GET_ITEM(consts, i)); 
} 

"kuralı" Burada bir Python tanımlayıcı yasal olan ASCII karakter tamamen oluşuyorsa bir Python kodu nesnesinin co_consts bir dize nesne enterne olur olduğunu . "left" içeri alındı, ancak "as,df" olmaz ve "1234", bir tanıtıcı bir basamakla başlayamasa bile içe aktarılabilir. Tanımlayıcılar ASCII olmayan karakterler içerebilmelerine rağmen, bu karakterler hala bu kontrol tarafından reddedilir. Gerçek tanımlayıcıları bu koddan hiçbir zaman geçemezler; koşulsuz olarak ASCII veya olmayan birkaç satırda yer alırlar. Bu kod değişebilir ve içeride ya da internette benzer şeyler yapan birçok kod var.

Dize internasyonu için "kurallar" ın kullanılmasını istemek, bir meteoroloğa soranın, düğününüzde yağmur yağdığı için neler olduğunu sormaktır. Size nasıl çalıştığını anlatabiliriz, ama sizin için fazla bir fayda olmayacak ve her zaman sürpriz olacaksınız.

+1

Evet. Uygulama detaylarıyla her zamanki gibi, ** RTFS ** gerçekten tek cevaptır .. – wim

-3

:

Eğer if a == b kullandığınızda a değeri b değeri olup olmadığını if a is b kullandığınızda a ve b aynı nesne (veya bellekte aynı noktayı paylaşan) varsa, kontrol oysa

, sen kontrol edilir.

Şimdi python sabit dizeleri ("blabla") tarafından tanımlanır. Yani:

>>> a = "abcdef" 
>>> a is "abcdef" 
True 

Ama bunu yaptığında: "" ile bir dize kullanarak C programlama dilinde

>>> a = "".join([chr(i) for i in range(ord('a'), ord('g'))]) 
>>> a 
'abcdef' 
>>> a is "abcdef" 
False 

, bir const char * yapacaktır. Sanırım burada olan bu.

İlgili konular