2016-11-07 2 views
8

나는 제 3 자 API 찾고 있어요 그리고 그들은 다음 코드 조각이 :파이썬에서 ' 0 0'의 의미?

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

내가 '\0'NULL 의미 이해, '\0\0' 어떤 특별한 의미를하거나 그냥 2 개 NULL의 뜻인가합니까?

답변

6

이 함수는 16 비트 배열을 반환합니다. 따라서 \0\0은 아마도 2 바이트 (16 비트)의 데이터 생성을 의미합니다. 즉, 2 바이트의 n 워드를 반환합니다.

10

array 클래스는 형식 문자 (형식 코드라고 함)와 이니셜 라이저를 허용합니다. H은 최소 크기가 2 바이트 인 부호없는 short를 의미하므로 '\0\0'을 만족합니다. * n 부분은 전체 배열을 NULL 바이트로 초기화하는 것입니다.

7

두 바이트가 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를 작동하는 것을 당신은 또한 파이썬 2에서 u'' 문자열을 제공 할 수 없습니다. 그 이외의 동작은 정확히 동일합니다.

그래서 '\0\0'은 편의를위한 것입니다. 어떠한 의미도 '\0\0'에 첨부되지 않습니다. (그들은 예를 들어,에서와 마찬가지로, C를)

어떤 의미가 정말 '\0'파이썬에서 또 다른 문자열입니다 '\0' 중 하나에 첨부되지 않았습니다.


이 문제에 대한 또 다른 예로서, 2 바이트 최소 부호의 int위한 'I' 유형 코드와 배열의 초기화를 수행하지만 64bit4 파이썬 빌드. 당신이 제공 한 조각의 정신에

, 당신은 이런 식으로 뭔가를 수행하여 배열을 초기화 할 것 :

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

네, 네 번 b'\0' 문자열 10 요소를 얻을 수 있습니다.최종 참고로


-다음 타이밍 파이썬 3에서 수행하지만이 같은이다 - 그가 사용하는 이유가 궁금 할 것이다 대신 '\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+ :-)에서 사용되지 얻을 수 있습니다.

관련 문제