바이트 개체는 immutable입니다. 이 항목 할당을 지원하지 않습니다왜 Python 3에서 ctypes를 사용하여 변경할 수없는 바이트 객체를 수정할 수 있습니까?
>>> bar = b"bar"
>>> bar[0] = b"#"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'bytes' object does not support item assignment
STR 객체는 불변 :
>>> bar = "bar"
>>> bar[0] = "#"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
STR 객체와 동일한 작업을 수행 할 수없는 상태 바이트하는 ctypes 객체를 수정하는 것이 가능하다. 이유를 설명해 주시겠습니까? 다음 예제를 살펴보십시오.
C 코드
char* foo(char *bar) {
bar[0] = '#';
return bar;
}
C 코드를 컴파일
gcc -shared -o clib.so -fPIC clib.c
바이트를 시도
파이썬 코드
,536,913,632 10import ctypes
clib = ctypes.CDLL('./clib.so')
bar = b"bar"
print("Before:", bar, id(bar))
clib.foo(bar)
print("After: ", bar, id(bar))
파이썬 코드 출력
Before: b'bar' 140451244811328
After: b'#ar' 140451244811328
str을 시도
STR 객체는 파이썬 3에서 불변하지만, 바이트는 달리이하는 ctypes으로 수정할 수는 없습니다 객체.
파이썬 코드
import ctypes
clib = ctypes.CDLL('./clib.so')
bar = "bar"
print("Before:", bar, id(bar))
clib.foo(bar)
print("After: ", bar, id(bar))
파이썬 3
Before: bar 140385853714080
After: bar 140385853714080
여러분은 막후에서 벗어나므로 기본적으로 어떤 것도 가능합니다. –
좋아, 나는 그것을 받아 들일 수 있었지만 왜 str 객체로 같은 것을 할 수 없는지? –
문자열 시도에 대한 코드를 표시 할 수 있습니까? –