首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

WTF Python:有趣且鲜为人知Python特性

说明: Python 字典通过检查键值是否相等和比较哈希来确定两个键是否相同。 具有相同不可变对象Python 中始终具有相同哈希。...函数时,Python建了一个 WTF 类对象传给 id 函数。...说明: 由于循环在 Python 中工作方式,赋值语句 i = 10 并不会影响迭代循环,在每次迭代开始之前,迭代器 (这里指 range(4)) 生成一个元素就被解包赋值目标列表变量 (这里指...== 运算符比较两个运算对象是否相等。 因此 is 代表引用相同,== 代表相等。...引用自 https://docs.python.org/3/c-api/long.html 当前实现为-5 到 256 之间所有整数保留一个整数对象数组, 当你创建了一个该范围内整数时, 你只需要返回现有对象引用

1.3K50

Python里那些深不见底“坑”

这是因为[[]]*3并不是创建了三个不同list,而是创建了三个指向同一个list对象,所以,当我们操作第一个元素时,其他两个元素内容也会发生变化原因。...类变量初始化 不要在对象init函数之外初始化类属性,主要有两个问题 如果类属性更改,则初始值更改。 如果将可变对象设置为默认,您将获得跨实例共享相同对象。...默认情况下,[-5,256]会在解释器第一次启动时创建缓存,所以才会有上面的奇怪行为。这是个很常见但很容易被忽略一个坑。...Python还保留对常用字符串引用,并且可以在比较is字符串身份(即使用)时产生类似的混淆行为。...>>> 'python' is 'py' + 'thon' True python字符串被缓存了,所有python字符串都是该对象引用,对于不常见字符串,即使字符串相等,比较身份也会失败

61220
您找到你想要的搜索结果了吗?
是的
没有找到

Python 那些鲜为人知故事

时候, Python 解释器会创建一个对象, 然后同时引用第二个变量(译: 仅适用于3.7以下, 详细情况请看这里). 如果你在不同行上进行赋值操作, 它就不会“知道”已经有一个 wtf!...具有相同不可变对象Python中始终具有相同哈希. >>> 5 == 5.0 True >>> hash(5) == hash(5.0) True 注意: 具有不同对象也可能具有相同哈希...说明: 当调用 id 函数时, Python建了一个 WTF 类对象传给 id 函数. 然后 id 函数获取其id (也就是内存地址), 然后丢弃该对象. 该对象就被销毁了....引用自 https://docs.python.org/3/c-api/long.html 当前实现为-5到256之间所有整数保留一个整数对象数组, 当你创建了一个该范围内整数时, 你只需要返回现有对象引用...现在, 我们将通过将字典中键 5 设置为元组 ({}, 5) 来创建循环引用 (输出中 {…} 指与 a 引用相同对象).

1.2K30

Python数字类型

还是要强调一下Python变量和数据类型关系,变量只是对某个对象引用或者说代号、名字、调用等等,变量本身没有数据类型概念 。只有1,[1,2],"hello"这一类对象才具有数据类型概念。...小整数对象python初始化时候会自动建立一个整数对象池,方便我们调用,避免后期重复生成!这是一个包含262个指向整数对象指针数组,范围是-5到256。...也就是说比如整数10,即使我们在程序里没有创建它,其实在Python后台已经悄悄为我们创建了。 为什么要这样呢?...我们都知道,在程序运行时,包括Python后台自己运行环境中,会频繁使用这一范围内整数,如果每需要一个,你就创建一个,那么无疑会增加很多开销。...上面,我变量a赋值了整数100,看了一下它内存地址。然后我把a删了,又创建个新变量b,依然赋值为100,再次看下b内存地址,和以前a存在是一样

1K40

Python带我飞:50个有趣而又鲜为人知Python特性

如果知道, 自己点奖励, 然后去看下一个例子。 确认结果是否如你所料。 确认你是否知道这背后原理。 PS: 你也可以在命令行阅读 WTFpython....说明: Python 字典通过检查键值是否相等和比较哈希来确定两个键是否相同。 具有相同不可变对象Python中始终具有相同哈希。...函数时, Python建了一个 WTF 类对象传给 id 函数。...说明: 由于循环在Python中工作方式, 赋值语句 i = 10 并不会影响迭代循环, 在每次迭代开始之前, 迭代器(这里指 range(4)) 生成一个元素就被解包赋值目标列表变量(这里指...当 a 和 b 在同一行中使用相同初始化时,会指向同一个对象

74010

Python带我飞:50个有趣而又鲜为人知Python特性

如果知道, 自己点奖励, 然后去看下一个例子。 确认结果是否如你所料。 确认你是否知道这背后原理。 PS: 你也可以在命令行阅读 WTFpython....可以在这里找到 CPython 对此规则实现。 ? 当在同一行将 a 和 b 设置为 "wtf!" 时候, Python 解释器会创建一个对象, 然后同时引用第二个变量....说明: Python 字典通过检查键值是否相等和比较哈希来确定两个键是否相同。 具有相同不可变对象Python中始终具有相同哈希。...函数时, Python建了一个 WTF 类对象传给 id 函数。...说明: 由于循环在Python中工作方式, 赋值语句 i = 10 并不会影响迭代循环, 在每次迭代开始之前, 迭代器(这里指 range(4)) 生成一个元素就被解包赋值目标列表变量(这里指

62320

首先得声明一下,本文不是在黑 Python

当在同一行将 a 和 b 设置为 "wtf!" 时候,Python 解释器会创建一个对象,然后同时引用第二个变量(译:仅适用于3.7以下,详细情况请看这里)。...说明: 当调用 id 函数时,Python建了一个 WTF 类对象传给 id 函数. 然后 id 函数获取其 id (也就是内存地址),然后丢弃该对象,该对象就被销毁了。...说明: 由于循环在 Python 中工作方式,赋值语句 i = 10 并不会影响迭代循环,在每次迭代开始之前,迭代器(这里指 range(4) ) 生成一个元素就被解包赋值目标列表变量(这里指...因此 is 代表引用相同,== 代表相等,还有一个例子可以用来说明这一点—— ?...256一个已经存在对象,而 257 不是 当你启动 Python 时候,数值为 -5 到 256 对象就已经被分配好了,这些数字因为经常被使用,所以会被提前准备好。

47910

如何释放Python占用内存?

需要注意是,当使用某个引用作为参数,传递给getrefcount()时,参数实际上创建了一个临时引用。因此,getrefcount()所得到结果,会比期望多1。...我们也可以自定义一个对象引用其它对象: 可以看到,a引用对象b。 由于对象b引用了两次a,a引用计数增加了2,使用del删除,引用也取消了。...当变量被绑定在一个对象时候,该变量引用计数就是1,(还有另外一些情况也会导致变量引用计数增加),系统会自动维护这些标签,定时扫描,当某标签引用计数变为0时候,该对就会被回收。...对于简单Python对象,例如数值、字符串,元组(tuple不允许被更改)采用是复制方式(深拷贝),也就是说当将另一个变量B赋值变量A时,虽然A和B内存空间仍然相同,但当A发生变化时,会重新...此处所说对象应该特指复合类型对象(如类、list等),对于字符串、整数等类型,变量id是随改变而改变。 2、一个对象id在CPython解释器里就代表它在内存中地址。

1.4K10

分享 10 个高频 Python 面试题

为了节省时间和内存成本,Python 总是预先加载 [-5, 256] 范围内所有小整数。 因此,[-5, 256] 中所有整数都已经保存在内存中。...当声明此范围内整数变量时,Python 只是将缓存整数引用到它,不会创建任何新对象。 因此,对结果解释是: 当变量 a 和 b 分配给 256 时,它们被引用到存储 256 相同内存位置。...回答: 既不是按传递,也不是按引用传递,Python 自有一套机制,我们都知道 Python 世界里,万物皆对象,从这个方面讲,传递给函数,都是对象地址,这有点像引用概念,但是 Python...如果从其他编程语言过来学 Python ,可以简单这么理解:对于不可变对象,是按传递,函数内部不会修改不可变对象,对于可变对象,是按引用(地址)传递,函数内部修改会影响到参数本身。...回答: Python 使用一种称为引用计数方法来决定何时需要在内存中收集对象。 简单来说,Python 会计算每个对象引用计数,当一个对象没有引用时,会自动收集。

67310

Python工程师必考6个经典面试题

标准操作符中比较操作符,用来比较判断两个对象value()是否相等 is也被叫做同一性运算符(对象标示符),这个运算符比较判断对象唯一身份标识,也就是id(内存中地址)是否相同 我们在检查...所以 “hello” 在内存中只有一个副本,a 和 b id 相同,而 “hello world” 是长字符串,不驻留内存,Python中各自创建了对象来表示 a 和 b,所以他们相同但 id...试一下当a=247,b=247时它们id还是否会相等。事实上Python 为了优化速度,使用了小整数对象池,避免为整数频繁申请和销毁内存空间。...而Python 对小整数定义是 [-5, 257),只有数字在-5到256之间它们id才会相等,超过了这个范围就不行了。...11.例举你知道 Python 对象命名规范,例如方法或者类等 12.Python注释有几种? 13.如何优雅一个函数加注释? 14.如何变量加注释?

47330

python基础(8)python中is和==区别详解

前置知识点 当我们创建一个对象时,我们要知道它内部干了些什么 1.创建了一个随机id,开辟了一片内存地址 2.自动声明了这个对象类型type 3.这个对象赋值value 小例子 a = 1 print...,那么接下来理解is和==区别就好多了 is:用于判断两个变量引用对象是否为同一个,既比较对象地址。...==:用于判断引用变量引用对象是否相等,默认调用对象 __eq__()方法。...下面会说明 整数缓存问题 Python 仅仅对比较小整数对象进行缓存(范围为[-5, 256])缓存起来,而并非是所有整数对象。...总结 is 比较两个对象 id 是否相等,是否指向同一个内存地址 == 比较是两个对象内容是否相等,是否相等 小整数对象[-5,256]在全局解释器范围内被放入缓存供重复使用 is 运算符比

32830

一文带你搞懂Python数据类型之数字类型

一、数字类型 数字类型用于存储数学意义上数值。 数字类型是不可变类型。所谓不可变类型,指的是类型一旦有不同了,那么它就是一个全新对象。...数字1和2分别代表两个不同对象,对变量重新赋值一个数字类型,会新建一个数字对象Python变量和数据类型关系。...这是一个包含262个指向整数对象指针数组,范围是-5到256。也就是说比如整数10,即使我们在程序里没有创建它,其实在Python后台已经悄悄为我们创建了。...验证一下小整数对象存在 在程序运行时,包括Python后台自己运行环境中,会频繁使用这一范围内整数,如果每需要一个,你就创建一个,那么无疑会增加很多开销。...id(257)地址,我们能看出小整数对象范围,正好是-5到256

64420

Python完全自学教程》免费在线连载3.6

如3.1.2节所述,在 Python 中两个对象是否“同一”,可以看它们内存地址是否相同,比如: >>> a = 256 >>> b = 256 >>> id(a) == id(b) # (3)...同样是整数,这时候两个变量分别引用了两个不同对象。 如果查看浮点数——所有浮点数都如此。...,Python 在内存中创建了对象;变量 g 再引用一个浮点数对象,只不过此对象还是 3.14,Python 在内存中又创建了一个对象,而没有将变量 g 指向前面那个 3.14 对象。...前面看到变量 c 和 d 也如此,分别引用两个不同 257 对象。但是变量 a 和 b 则不然,虽然操作与后面的二者类似,但它们引用了同一个 256 对象。...这是因为 Python 中做了一个规定,将常用整数 -5 到 256)默认保存在内存中,从而节省内存开支。如果变量引用这些,就直接指向内存中已有的,不再新建。所以,才出现上面的操作结果。

39130

Python数据魔术】:揭秘类型奥秘,赋能代码创造

,不会回收,所有创建整数变量直接从对象池中引用即可。...# 但是注意Python仅仅对比较小整数对象进行缓存(范围为范围[-5, 256])缓存起来,而并非是所有整数对象。...# 也就说只有在这个[-5,256]范围内创建变量值使用is比较时候才会成立。 而保存为文件执行,结果是不一样,这是因为解释器做了一部分优化。即使整数超过256,使用is也是成立。...# 但是在python中有两个意外情况: # 1.使用python命令行时对于小整数[-5,256]区间内整数,python会创建小整数对象池,这些对象一旦创建, # 就不会回收,所有新创建在这个范围整数都是直接引用他即可...# 所以造成在[-5,256]区间内整数不同变量只要相同引用地址也相同。 # 此范围外整数同样遵循新建一个变量赋予一个地址。

8310

python | 内存模型

python中数据运算其内存是如何变化呢? 在回答上面的问题之前,首先看一下python中可变数据和不可变数据。...不可变数据类型:不允许变量发生变化,如果改变了变量,相当于是新建了一个对象,而对于相同对象,在内存中则只有一个对象,内部会有一个引用计数来记录有多少个变量引用这个对象; 可变数据类型:...允许变量发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量,而不会新建一个对象,变量引用对象地址也不会变化,不过对于相同不同对象,在内存中则会存在不同对象,即每个对象都有自己地址...,相当于内存中对于同对象保存了多份,这里不存在引用计数,是实实在在对象。...对小整数定义是 [-5, 256] 这些整数对象是提前建立好,不会被垃圾回收。在这个范围内所有的整数都只会被建立一次。

27810

Python 精讲 | 奇葩 is

你要说分别赋值变量就是不相同,那我们把赋变量,从 1.0 改成 1,结果就又成了 True。 难道是因为浮点数和整数类型原因吗?...而当你创建一个在这个范围内整数时,就不是临时再去创建一个对象,而是直接指向已经建好对象。所以不管你有多少个变量,实际都是同一个对象。...这就要说到 Python一个优化: 2. 大整数缓存 尽管大于 256 整数不会提前创建好,但如果 Python 解释器发现你用到重复整数常量,也会将后面的变量指向已经创建好对象。...所以不仅是在 py 文件中,即使在交互环境下,如果把两个大整数赋值写在同一行,或者放在一个代码块中,也会发现它们是相同。...比如在 Python 3.7 中,不同作用域整数不会被缓存为同一个对象,但在 Python 3.11 中,却是相同。 作为开发者来说,最好选择就是不要在比较数值相等时使用 is。

13310

Python 精讲 | 奇葩 is

你要说分别赋值变量就是不相同,那我们把赋变量,从 1.0 改成 1,结果就又成了 True。 难道是因为浮点数和整数类型原因吗?...而当你创建一个在这个范围内整数时,就不是临时再去创建一个对象,而是直接指向已经建好对象。所以不管你有多少个变量,实际都是同一个对象。...这就要说到 Python一个优化: 2. 大整数缓存 尽管大于 256 整数不会提前创建好,但如果 Python 解释器发现你用到重复整数常量,也会将后面的变量指向已经创建好对象。...所以不仅是在 py 文件中,即使在交互环境下,如果把两个大整数赋值写在同一行,或者放在一个代码块中,也会发现它们是相同。...比如在 Python 3.7 中,不同作用域整数不会被缓存为同一个对象,但在 Python 3.11 中,却是相同。 作为开发者来说,最好选择就是不要在比较数值相等时使用 is。

10110

Python:What the f*ck Python(上)

建了一个 WTF 类对象传给 id 函数,然后 id 函数获取其 id (也就是内存地址),然后丢弃该对象,该对象就被销毁了。...当我们连续两次进行这个操作时,Python会将相同内存地址分配给第二个对象,因为在 CPython 中 id 函数使用对象内存地址作为对象id,所以两个对象id相同。...; b = 257 >>> a is b True 说明: is 和 == 区别 is 运算符检查两个运算对象是否引用自同一对象 == 运算符比较两个运算对象是否相等 因此 is 代表引用相同,...当前实现为 -5 到 256 之间所有整数保留一个整数对象数组,当你创建了一个该范围内整数时,你只需要返回现有对象引用。所以改变 1 是有可能。...但是,当 a 和 b 在同一行中使用相同初始化时,会指向同一个对象

1.3K20

Python 进阶指南(编程轻松进阶):九、深奥 Python 怪现象

尽管整数值42和浮点42.0具有相同,但它们是保存在计算机内存中不同位置两个不同对象。...作为一个微小优化,CPython(Python 解释器可从python.org下载)在每个程序开始时为-5到256创建整数对象。...这种行为也通过不存储重复整数来节省内存,如图 9-1 所示。 图 9-1:Python 通过对单个整数对象(左)使用多个引用来节省内存,而不是对每个引用使用单独、重复整数对象(右)。...表达式257 is 257计算结果为True,但是 CPython 在同一个语句中重用为相同字面值创建整数对象: >>> 257 is 257 True 当然,现实世界程序通常只使用一个整数,...注意到分配给eggs'cat'字符串和分配给spam'cat'字符串相同;因此,它没有创建第二个冗余字符串对象,而是eggs分配了一个引用,指向spam使用一个字符串对象

58940

Python 抓网页,你想问都帮答好了,你还有不懂吗?

,任何需要引用这些整数对象地方,都不再重新创建新对象,而是直接引用缓存中对象。...Python把这些可能频繁使用整数对象规定在范围[-5, 256]之间对象放在 small_ints中,但凡是需要用些小整数时,就从这里面取,不再去临时创建新对象。...Python内部为了将性能进一步提高,凡是在一个代码块中创建整数对象,如果存在一个与其相同对象于该代码块中了,那么就直接引用,否则创建一个对象出来。...Python出于对性能考虑,但凡是不可变对象,在同一个代码块中对象,只有是相同对象,就不会重复创建,而是直接引用已经存在对象。因此,不仅是整数对象,还有字符串对象也遵循同样原则。...所以 a is b就理所当然返回 True了,而 c和 a不在同一个代码块中,因此在Python内部创建了两个都是257对象

1K30

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券