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+
:-).