技术标签: python学习笔记
想法来自于 https://blog.csdn.net/qq_43657442/article/details/108384183
上一篇末尾提到 ,我想个办法从 id 获得值。来测试一下,看看我在程序里面初始化 a = [1,2,3,4],然后我取最后一个元素(4)的 id 加 32 位 ,把这个 id 的值取出来看看是不是 5
先实现下看看效果
import ctypes
a = [1,2,3,4]
print("最后一个元素(4)的id是:", id(a[-1]))
address1 = id(a[-1])
get_value1 = ctypes.cast(address1, ctypes.py_object).value # 读取地址中的变量
print("测试我们通过地址取值的有效性:",get_value1)
address = address1 + 32
get_value = ctypes.cast(address, ctypes.py_object).value # 读取地址中的变量
print("整数4的地址往后移动32位存放的值是:",get_value)
输出
最后一个元素(4)的id是: 8791254619264
测试我们通过地址取值的有效性: 4
整数4的地址往后移动32位存放的值是: 5
注:id() 函数返回的地址是 int 型的,所以我直接加 32 是行的通的
证明了 python 的确是用了一个整数缓冲池缓存了指定范围的整数,不过这个范围有多大呢
测试边界范围
我手动测试了一遍发现范围是 -5 — 256
import ctypes
a = [1,2,3,4]
print("最后一个元素(4)的id是:", id(a[-1]))
address1 = id(a[-1])
get_value1 = ctypes.cast(address1, ctypes.py_object).value # 读取地址中的变量
print("测试我们通过地址取值的有效性:",get_value1)
address = address1 + 32*(-9) # 此时输出 -5
# address = address1 + 32*(252) #此时输出 256
get_value = ctypes.cast(address, ctypes.py_object).value # 读取地址中的变量
print("整数4的地址往后移动32位存放的值是:",get_value)
当 +32*(253) 时
Fatal Python error: GC object already tracked
Current thread 0x00000b88 (most recent call first): File
“d:/\u5404\u79cd\u6587\u4ef6\u5939/\u5b66\u4e60\u8d44\u6599/matplotlib.pyplot\u5e93\u7ed8\u56fe\u4ee3\u7801\u53ca\u89c6\u9891/plttest.py”,
line 112 in
初此之外的 +32*(254)、 +32*(255)、 +32*(1000)、 +32*(-10)、 +32*(-11)、 +32*(25)等其他超出 -5 — 256 范围的都是没有输出,
可能是在调用 ctypes.cast(address, ctypes.py_object).value 时对应地址啥都没有,print语句就不管用了,所以没输出
import ctypes
a = [1,2,3,4]
print("最后一个元素(4)的id是:", id(a[-1]))
address1 = id(a[-1])
get_value1 = ctypes.cast(address1, ctypes.py_object).value # 读取地址中的变量
print("测试我们通过地址取值的有效性:",get_value1)
address = address1 + 32*(254)
get_value = ctypes.cast(address, ctypes.py_object).value # 读取地址中的变量
print("整数4的地址往后移动32位存放的值是:")
print(get_value)
输出
最后一个元素(4)的id是: 8791254619264
测试我们通过地址取值的有效性: 4
整数4的地址往后移动32位存放的值是:
Python的multiprocessing.Pool可以方便地创建进程池,提高程序并行性,可以用不同的进程来运行不同的服务程序。 处理日志是Web服务器的一个重要功能,Python的原生logging模块提供了多种日志处理方式(logging.handlers),其中 QueueHandler与QueueListener结合使用,可以让日志处理和写日志在不同的线程上运行,这对于Web应用非常重要...
strip()方法语法:str.strip([chars]); 声明:str为字符串,rm为要删除的字符序列 str.strip(rm) 删除字符串中开头、结尾处,位于rm删除序列的字符 str.lstrip(rm) 删除字符串中开头处,位于 rm删除序列的字符 str.rstrip(rm) 删除字符串中结尾处,位于 rm删除序列的字符 究竟何为'首尾'?实验之 实验证明:所谓的首、尾,判定依据是...
Python探究–对比 +与+= 1. 简介 Python中经常用到运算符+与+=探究二者区别: 探究a = a + b和a += b在过程上有何不同(执行结果是相同的)。 +对应方法add或__add__,前者属于operator模块(Python底层,一些基本数据类型的运算符),后者属于类的魔术方法,用于扩展类的功能。 将 a+b的值作为返回值,返回给a 同理+=对应的方法为iad...
起因 今天处理的数据集里,图片同时有 “.jpg” 和 “.JPG” 两种后缀名,因此我要实现一个 找出所有不同后缀图片 的功能。一开始,实现该功能的模块我是这么写的: 代码也run起来了。但是回头检查的时候一看,哎不对,为什么只有 “.jpg” 后缀名的图片被处理了。 debug 在debug过程中,我发现上面的功能模块只会...
结论 因为之前对python中的 zip 和 * ,搞得不是很清楚,这次做项目时又遇到这个问题,所以上网查阅,并经过自己编写代码进行实验,得出以下结论: 作用域 zip() zip(* ) 简述 将list合并打包 将list进行unpack 在rank上的变化 插入axis=1,其余不变 将axis=0和axis=1对换,其余不变 在type上的变化 ndarray &n...
Syntax range ( [start,] stop [, step] ) xrange ( [start,] stop [, step] ) Summary xrange 和 range 这两个基本上都是在循环的时候用。 xrange 用法与 range 完全相同,所不同的是生成的不是一个list对象,而是一个生成器。 生成很大的数字序列的时候,用 xrange 会比 range 性能优很多...
id()返回的是变量的内存地址 这个问题涉及到Python的变量定义,以及垃圾回收机制 综合上述实验,我们可以知道,对于非引用类型的变量如a = 2和b = 2,此时a和 b的id是一样的。对于引用类型的变量,如列表,a = [2]和b = [2],此时a和b的引用仍然是不一样的,但是a[0]和b[0]的id是一样的,因为a[0]不是引用类型的变量。 再看下面的例子 这里,列表a和b的引用是一样的...
本文主要回答python的装饰器函数内部的代码要放在一个新的函数里?以及由此引发的其他对python装饰器的探讨 1、一般装饰器函数写法 我们看到的python装饰器函数写法如下: 2、疑问 其实logging可以这样写, 哪为什么还要在里面增加一个函数(wrapper),再将print放再wrapper里面呢? 后面我才发现这样写会出现一个很大的问题: python在编译时就执行了print这条...
本人博客!! 文章目录 〇.遇到的小问题!!! Ⅰ.全部暴露 Ⅱ.只将某个函数暴露 Ⅲ.暴露多个函数 1.直接暴露 2.暴露多个函数(字典) 暴露对象(object)中的多个函数 暴露类(class)中的多个函数 Ⅳ.带\*args和\*\*kwargs的函数 同一个类内 不同类内(GAN代码所用) 参数解析 bool类型参数 前言:在做GAN的时候,发现人家的代码都是用fire来控制输入的,觉得...
前言 这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题 于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。 微信小程序搜索:Python面试宝典 或可关注原创个人博客:https://lienze.t...