Python 的一个坑(元组)? or (多重赋值)?

2016-04-17 23:39:50 +08:00
 itlynn
想问问各位 Python 大牛,这段代码我该如何理解?
代码如下:

(a,b) = (1,2)
print id((a,b))
(a,b) = ("string",2)
print id((a,b))
print type((a,b))

问题:在各种环境测试下,发现有时候两个 id()返回值相同,有时又不同。希望大牛给分析下
4678 次点击
所在节点    Python
12 条回复
wowpanda
2016-04-17 23:48:54 +08:00
楼主能贴出来在那些环境相同,哪些不同吗
Abirdcfly
2016-04-17 23:54:31 +08:00
没那么复杂
>>> (a,b) = (1,2)
>>> print id((a,b))
140320109531008
>>> (a,b) = ("string",2)
>>> print id((a,b))
140320109530936
上面的不一样.
>>> (a,b) = (1,2);print id((a,b));(a,b) = ("string",2);print id((a,b))
140320109531080
140320109531080
下面的一样.

为什么我就不清楚了..只能解释为解释器的优化..
我之前问过一个类似的...回答那哥们也是从解释器优化说的..字节码显示是优化过了..为什么就不清楚了..


[When the Python interpreter deals with a .py file, is it different from dealing with a single statement?]( http://stackoverflow.com/questions/36474782/when-the-python-interpreter-deals-with-a-py-file-is-it-different-from-dealing)

有哪位大神路过看看呗?
Abirdcfly
2016-04-17 23:55:01 +08:00
@wowpanda 求解释
itlynn
2016-04-18 00:03:46 +08:00
@wowpanda

windows 下:
ulipay , sublime, 终端 运行 py 文件, 结果为同一个 id
但是在终端下手工输入返回不是同一个 id
wartime
2016-04-18 00:05:17 +08:00
id(...)
id(object) -> integer

Return the identity of an object. This is guaranteed to be unique among
simultaneously existing objects. (Hint: it's the object's memory address.)

(a, b) 实际上是临时分配的一个变量,由于没有引用可能马上释放。
(1, 2) 和 ('string', 2) 如果凑巧在相同位置,看上去 id 值一样,实际上之前的已经释放,内容已经改变。

c = (a,b) = (1,2)
print id(c)
d = (a,b) = ("string",2)
print id(d)

在 c 和 d 的值不变的情况下, id(c) id(d)值不变 (tuple 是 immutable)
glennq
2016-04-18 00:08:56 +08:00
一样是巧合,不一样才正常
kkhaike
2016-04-18 00:11:50 +08:00
@wartime 这个解释是对的
itlynn
2016-04-18 00:18:36 +08:00
@wartime @Abirdcfly @glennq @wowpanda @kkhaike
感谢各位,我的理解是
(a,b) = (1,2) #这里进行了一次多重赋值, a = 1;b = 2
print id((a,b)) #由于(a,b)并没有赋值给一个对象,只是一个临时的存储 a,b 的元组,所以系统 会 or 可能会 将之销毁
(a,b) = ("string",2) #将 a 重新赋值,则重新创建一个字符串对象并指向该内存地址
print id((a,b)) #所以此处并不会与上的 id((a,b))相同,如果相同纯属偶然?
不知这样理解合理吗?
wartime
2016-04-18 00:31:09 +08:00
@itlynn 对,而且 id((a,b))是取元组的 id ,和 a 、 b 的内存地址无关。
fy
2016-04-18 01:08:10 +08:00
楼主啊,你以为多重赋值左边的东西真的是元组??

a, b = (a, b) = [a, b] = 1, 2

这三种左侧的字节码是一模一样的,而且跟元组没有任何关系。

你后来 id((a,b)) 这才是建立了一个元组
jiang42
2016-04-18 01:52:38 +08:00
@wartime 补充一点, id 的实现方式与 Python 的实现方式有关, CPython 用的是内存地址。
@itlynn
itlynn
2016-04-18 19:31:12 +08:00
@fy
@jiang42 谢谢!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/271853

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX