首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在python中使用指针地址调用函数

在python中使用指针地址调用函数
EN

Stack Overflow用户
提问于 2011-12-28 12:40:25
回答 2查看 2.9K关注 0票数 3

我有一个简单的函数,我想在两个独立的程序执行中调用它。我第一次运行这个程序时,它将函数指针保存到一个文件中:

代码语言:javascript
代码运行次数:0
运行
复制
import cPickle

def test():
    pass

def main():
    a = test
    pFile = open('test.txt', 'wb')
    cPickle.dump(a, pFile)
    pFile.close()

第二次我想加载文件并执行保存在对象中的函数:

代码语言:javascript
代码运行次数:0
运行
复制
import cPickle

def test():
    pass

def main():
    pFile = open('test.txt', 'rb')
    a = cPickle.load(pFile)
    pFile.close()
    a() 

请注意,在cPickle中,这是可行的,这有点奇怪,因为我认为这基本上是指向函数的指针,并且在运行时会发生变化?当我打印'a‘时,它给我类似于:function test at 0x0351C170:。

所以我想我的第一个问题是,即使引用地址在运行时应该改变,为什么这种方法仍然有效?

我的第二个问题是,如果它没有改变/或者它以某种方式不相关,我如何仅通过在0x0351C170:处具有string::function test来执行函数。例如,像这样:

代码语言:javascript
代码运行次数:0
运行
复制
def test():
    print 'test'

a = test
a()          #outputs: 'test'

b = str(a)   #<function test at 0x03509170>
eval(b)()    #error
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-28 12:45:22

请参阅pickle documentation

可以对以下类型进行酸洗:

Unicode、True和False

  • integers,长整型、浮点数、复数以及仅包含在module

  • classes顶层定义的module

  • built-in函数顶层定义的可挑取objects

  • functions的Unicode module

  • classes列表、集合和字典(此类类的__dict____setstate__()是可挑取的(有关详细信息,请参见pickle协议一节)

因此,pickle模块实际上在pickle文件中写出了Python字节码。重新加载pickle文件时,将从代码对象重新创建该函数。

要回答你的问题的第二部分,不,仅仅通过知道内部地址值是不可能直接调用Python代码的。

票数 2
EN

Stack Overflow用户

发布于 2011-12-28 12:46:50

您不能在给定的地址上执行函数。

是的,引用地址在运行时更改。当cPickle加载文件时,它会创建一个函数,您看到的就是该函数。它将不具有与原始函数相同的地址。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8651928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档