gpt4 book ai didi

Python ctypes 和可变性

转载 作者:行者123 更新时间:2023-12-03 16:32:38 25 4
gpt4 key购买 nike

我注意到使用 ctypes 将 Python 对象传递给 native 代码可以打破可变性预期。
例如,如果我有一个 C 函数,例如:

int print_and_mutate(char *str)
{
str[0] = 'X';
return printf("%s\n", str);
}
我这样称呼它:
from ctypes import *
lib = cdll.LoadLibrary("foo.so")

s = b"asdf"
lib.print_and_mutate(s)
s的值改变了,现在是 b"Xsdf" .
Python 文档说 "You should be careful, however, not to pass them to functions expecting pointers to mutable memory." .
这仅仅是因为它打破了对哪些类型不可变的预期,还是其他东西会因此而打破?换句话说,如果我清楚地了解我原来的 bytes对象会改变,即使通常 bytes是不可变的,可以吗,或者如果我不使用 create_string_buffer 以后我会得到某种令人讨厌的惊喜吗?就像我应该的那样?

最佳答案

这听起来是您在 CPython 中最接近 UB 的方式。
虽然目前可能不会发生这种情况,但 CPython 可以为您提供一个指向只读内存的指针,并且程序将出现段错误。
此外,CPython 可能与其他对象共享字符串或子切片,并且您将修改所有这些。

关于Python ctypes 和可变性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63968710/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com