Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 与memset抗争_Python_Memset - Fatal编程技术网

Python 与memset抗争

Python 与memset抗争,python,memset,Python,Memset,我想要一个类似指针的函数。因为我只允许将int作为参数传递,我希望能够将所有类型的数据传递给函数。(我无法修改此函数,因为它是在SDK中硬编码的) 所以我想使用一个变量的id,然后将这个值重新分配给另一个值,这个值将出现在我的函数中 我想要像这样的东西谁在工作 import ctypes a = 10 b = 12 print b #here I want 12 ctypes.memset(id(b), a, 8) print b #here I want 10 使用python类型的可能

我想要一个类似指针的函数。因为我只允许将
int
作为参数传递,我希望能够将所有类型的数据传递给函数。(我无法修改此函数,因为它是在SDK中硬编码的)

所以我想使用一个变量的id,然后将这个值重新分配给另一个值,这个值将出现在我的函数中

我想要像这样的东西谁在工作

import ctypes

a = 10
b = 12
print b #here I want 12

ctypes.memset(id(b), a, 8)
print b #here I want 10
使用python类型的可能性很大,这样我也可以传递一个可调用的对象。

更新:

因为主线程和后台线程在同一个程序上,共享内存。您可以使用单个字典创建用于存储变量及其键的容器:

import random

mystorage = {}


def getint(value):
    while True:
        key = random.randint(0, 0xffffffff)
        if key in mystorage:
            continue
        mystorage[key] = value
        return key


def getvalue(key):
    return mystorage.get(key)
如果密钥根据您的情况发生冲突,您可能需要在测试时添加写锁。但通常情况下,这对多线程程序很有效


使用
int
(实际上是
long
)类型传递任何可拾取的对象是一个好主意:

import codecs
import pickle


def dumps(payload):
    data = pickle.dumps(payload)
    return int(codecs.encode(data, 'hex'), 16)


def loads(intval):
    data = codecs.decode(hex(intval)[2:].encode('ascii'), 'hex')
    return pickle.loads(data)


assert loads(dumps({'foo': 'bar'})) == {'foo': 'bar'}
# no error

如果您使用的是Python3.2+,那么也可以使用
int.from_bytes()
int.to_bytes()
来实现这一点。

您也可以将
long
作为参数传递吗?文档中说int,但我用了很长的时间进行了测试。使用long而不是int有什么好处?不管怎样,谢谢你花时间回答。你可以使用列表:
a=[10];b=[12];打印b[0];b=a;打印b[0];a[0]=8;打印b[0]不,我不能,因为我不能将列表作为参数传递:/a将在其他作用域/脚本中定义,所以我真的需要一个像Ethanks这样的指针,这是个好主意。但遗憾的是,我们对2.7 python很感兴趣,而且sdk内部似乎进行了从long到int的转换,因为我遇到了这个错误:overflowerrror:python int太大,无法转换为C long,但这是一个好主意@如果您可以多次调用SDK,那么您可以将大的数字拆分为几个较小的数字。那么它就不会给出溢出错误。如果SDK不能保证按顺序运行这些数字,您甚至可以保留一些序列字节来保持这些数字的顺序。是的,这是一个想法,但它并不干净,因为传入此函数的参数在主线程中,而我们对该函数的调用在后台线程中。这将导致洪水和主线的延迟。但这是一个可行的解决方案。所以,如果没有其他解决办法,我就去做。另外,我不确定变量的发送端和接收端是否在同一个程序中(并共享内存)。但通常您可能希望尝试
memcache
:将对象存储在
memcache
中,但将创建的唯一整数密钥传递给SDK。这甚至可以跨多台机器工作。它将在同一个程序上。因此内存是共享的。就是为了这个,我想用memset。我不想使用外部库,因为它对于客户安装来说有点无聊。python中有没有一种方法可以将对象的内存表示形式复制到另一个对象上?sdk提供了一种存储字节的方法,并获取该字节的uuid,以便我以后可以恢复它们。无论如何,谢谢你的研究!:)