2016-11-07 20 views
8

Tôi đang nhìn vào một API bên thứ 3 và họ có đoạn mã sau:Ý nghĩa của ' 0 0' trong Python?

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

Tôi hiểu rằng '\0' nghĩa NULL, không '\0\0' có bất kỳ ý nghĩa đặc biệt hay nó chỉ có nghĩa là 2 NULL s?

Trả lời

6

Có vẻ như hàm này trả về một mảng gồm 16 bit; do đó \0\0 có thể là viết tắt của việc tạo hai byte (16 bit) dữ liệu. Nói cách khác, nó trả về n từ hai byte.

10

Lớp array chấp nhận ký tự định dạng (được gọi là mã đánh máy), sau đó là trình khởi tạo. H có nghĩa là một chữ ký ngắn, với kích thước tối thiểu là 2 byte, vì vậy, '\0\0' thỏa mãn điều đó. Phần * n là để khởi tạo toàn bộ mảng thành byte NULL.

7

Nó chỉ đảm bảo rằng hai byte được cung cấp n lần để kích thước của mảng sẽ bằng n. Nếu '\0' được cung cấp, mảng kết quả sẽ có size == n//2 (due to the type-code 'H' requiring 2 bytes); mà rõ ràng là truy cập trực quan:

>>> 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]) 

Lưu ý rằng, trong Python 3, nếu bạn cần cùng đoạn để làm việc bạn phảiprovide a bytes object như initializer lập luận để array:

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

Như bạn cũng không thể cung cấp một chuỗi u'' trong Python 2. Ngoài ra, hành vi vẫn giống hệt nhau.

Vì vậy, '\0\0' là vì lý do tiện lợi, không có gì khác. Không có ngữ nghĩa nào được đính kèm với '\0\0'.

Không ngữ nghĩa đang thực sự gắn liền với '\0' hoặc (như họ làm trong, ví dụ, C) '\0'chỉ là một chuỗi bằng Python.


Như một ví dụ nữa cho hành vi này, mất việc khởi tạo một mảng với một loại mã của 'I' cho ints unsigned với tối thiểu là 2 byte nhưng 4 trên 64bit xây dựng của Python.

Theo tinh thần của đoạn bạn đã cung cấp, bạn muốn khởi tạo mảng bằng cách làm một cái gì đó như thế này:

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

Có, bốn lần so với chuỗi b'\0' để có được 10 yếu tố.


Là một lưu ý thức-timings sau đây được thực hiện trên Python 3 nhưng 2 là như nhau - bạn có thể tự hỏi tại sao ông sử dụng '\0\0\' * n thay vì trực giác nhìn hơn [0] * n để khởi tạo mảng. Vâng, nó khá nhanh:

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 

Tất nhiên, bạn có thể làm tốt hơn (cho loại-mã khác hơn 'b') bằng cách cho ăn một bytearray-array. Một cách để khởi a bytearray is by providing an int as the number of items to initialize với byte null:

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

nhưng, nếu tôi nhớ không lầm thì cách bytearray(int) khởi tạo một bytearray có thể bị phản đối trong 3.7+ :-).

Các vấn đề liên quan