2016-11-07 12 views
8

मैं एक 3 पार्टी एपीआई पर देख रहा हूँ और वे कोड का निम्न भाग है:पायथन में ' 0 0' का अर्थ?

def array_u16 (n): return array('H', '\0\0'*n) 

मैं समझता हूँ '\0' मतलब यह है कि NULL, '\0\0' किसी विशेष अर्थ नहीं है या यह सिर्फ मतलब है 2 NULL रों करता है?

उत्तर

6

ऐसा लगता है कि यह फ़ंक्शन 16-बिट्स से बना सरणी देता है; इस प्रकार \0\0 शायद दो बाइट्स (जो कि 16 बिट्स) डेटा बनाने के लिए खड़ा है। दूसरे शब्दों में, यह दो बाइट्स के एन शब्द देता है।

10

array कक्षा एक प्रारूप चरित्र (जिसे टाइपकोड कहा जाता है) स्वीकार करता है जिसके बाद प्रारंभकर्ता होता है। H का मतलब है कि एक हस्ताक्षरित छोटा, न्यूनतम आकार 2 बाइट्स के साथ, '\0\0' उसे संतुष्ट करता है। * n भाग पूरे सरणी को नल बाइट्स में प्रारंभ करना है।

7

यह केवल आश्वस्त करता है कि दो बाइट n बार प्रदान किए जाते हैं ताकि सरणी का आकार n के बराबर होगा। यदि '\0' प्रदान किया गया था, परिणामी सरणी में size == n//2 (due to the type-code 'H' requiring 2 bytes) होगा; जो स्पष्ट रूप से काउंटर सहज है:

>>> array('H', b'\0\0' * 10) 
array('H', [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) 

के रूप में:

>>> array('H', '\0' * 10) # 5 elements 
array('H', [0, 0, 0, 0, 0]) 
>>> array('H', '\0\0' * 10) # 10 elements 
array('H', [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) 

ध्यान दें कि, अजगर 3 में, आप initializer तर्क array के रूप में काम करने के लिए यदि आप ही टुकड़ा आवश्यकता चाहिएprovide a bytes object आप Python 2 में u'' स्ट्रिंग भी प्रदान नहीं कर सकते हैं। इसके अलावा, व्यवहार बिल्कुल वही रहता है।

तो '\0\0' सुविधा कारणों से है, और कुछ नहीं। '\0\0' से कोई अर्थशास्त्र संलग्न नहीं है।

कोई अर्थ विज्ञान वास्तव में (के रूप में वे में करते हैं, उदाहरण के लिए C) '\0' या तो से जुड़े होते हैं '\0'सिर्फ अजगर में एक और स्ट्रिंग है।


इस व्यवहार के लिए एक और उदाहरण के रूप में, 2 बाइट्स की एक न्यूनतम के साथ अहस्ताक्षरित ints के लिए 'I' का एक प्रकार है-कोड के साथ एक सरणी का प्रारंभ हो जाती हैं लेकिन 464bit पर अजगर का निर्माण करता है।

टुकड़ा आपके द्वारा दिए गए की भावना में, आप कुछ इस तरह कर रही द्वारा सरणी को प्रारंभ करेंगे:

>>> array('I', b'\0\0\0\0' * 10) 
array('I', [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) 

हाँ, चार बार b'\0' स्ट्रिंग 10 तत्वों मिलता है।


एक अंतिम नोट के रूप में - निम्नलिखित समय अजगर 3 पर प्रदर्शन कर रहे हैं लेकिन 2 एक ही है - आप के लिए उत्सुक हों वह क्यों इस्तेमाल किया बजाय '\0\0\' * n अधिक सहज ज्ञान युक्त दिखने [0] * n प्रारंभ करने में सरणी खैर, यह काफी तेज है:

n = 10000 
%timeit array('I', [0]*n) 
1000 loops, best of 3: 212 µs per loop 

%timeit array('I', b'\0\0\0\0'* n) 
100000 loops, best of 3: 6.36 µs per loop 
बेशक

, आप एक bytearrayarray को खिला द्वारा (के लिए 'b' के अलावा अन्य प्रकार के कोड) बेहतर कर सकते हैं। एक तरह से अशक्त बाइट्स के साथ a bytearray is by providing an int as the number of items to initialize प्रारंभ करने में:

%timeit array('I', bytearray(n)) 
1000000 loops, best of 3: 1.72 µs per loop 

लेकिन, अगर मैं सही ढंग से याद है, एक bytearray आरंभ की bytearray(int) रास्ता 3.7+ :-) में पदावनत हो सकता है।

संबंधित मुद्दे