python – 为什么分配给多个目标(标识符/属性)会产生奇怪的结果?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 为什么分配给多个目标(标识符/属性)会产生奇怪的结果?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3035字,纯文字阅读大概需要5分钟。
内容图文
![python – 为什么分配给多个目标(标识符/属性)会产生奇怪的结果?](/upload/InfoBanner/zyjiaocheng/800/77acf052a8974bdca4d8bbaf70c2430c.jpg)
我有一些像这样的代码:
def foo():
bar = initial_bar = Bar()
while True:
next_bar = Bar()
bar.next_bar = next_bar
bar = next_bar
return initial_bar
意图是形成一系列可以遵循的链条,链表样式.
这一切都非常好;但是通过一些被误导的概念,我想用一条线将它剪下来,将循环结束时的赋值复合成一条线.
def foo():
bar = initial_bar = Bar()
while True:
next_bar = Bar()
bar = bar.next_bar = next_bar
return initial_bar
因为bar = bar.next_bar = next_bar将扩展为bar.next_bar = next_bar,然后是bar = bar.next_bar. (除非它没有.)
问题是,这不起作用;返回的“初始条”没有定义其next_bar.通过回到更明确的两线解决方案,我可以轻松地解决它,但是发生了什么?
解决方法:
是时候退出dis了.
>>> import dis
>>> dis.dis(foo)
2 0 LOAD_GLOBAL 0 (Bar)
3 CALL_FUNCTION 0
6 DUP_TOP
7 STORE_FAST 0 (bar)
10 STORE_FAST 1 (initial_bar)
3 13 SETUP_LOOP 32 (to 48)
>> 16 LOAD_GLOBAL 1 (True)
19 POP_JUMP_IF_FALSE 47
4 22 LOAD_GLOBAL 0 (Bar)
25 CALL_FUNCTION 0
28 STORE_FAST 2 (next_bar)
5 31 LOAD_FAST 2 (next_bar)
34 DUP_TOP
35 STORE_FAST 0 (bar)
38 LOAD_FAST 0 (bar)
41 STORE_ATTR 2 (next_bar)
44 JUMP_ABSOLUTE 16
>> 47 POP_BLOCK
6 >> 48 LOAD_FAST 1 (initial_bar)
51 RETURN_VALUE
如果仔细观察,你会看到在关键线(第5行,见左边的数字,位置31-47),它会这样做:
>加载next_bar(31)两次(34);
>将它(堆栈上的第一个副本)写入bar(35);
>将它(堆栈上的第二个副本)写入bar.next_bar(38,41).
在最小的测试用例中更明显地看到了这一点.
>>> def a():
... b = c = d
...
>>> dis.dis(a)
2 0 LOAD_GLOBAL 0 (d)
3 DUP_TOP
4 STORE_FAST 0 (b)
7 STORE_FAST 1 (c)
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
看看它在做什么.这意味着b = c = d实际上等于b = d; c = d.通常情况下这并不重要,但在最初提到的情况下,它确实很重要.这意味着在关键线上,
bar = bar.next_bar = next_bar
不等于
bar.next_bar = next_bar
bar = next_bar
而是为了
bar = next_bar
bar.next_bar = next_bar
事实上,这是在Python文档的第6.2节中记录的,Simple statements, Assignment statements:
An assignment statement evaluates the expression list (remember that this can be a single expression or a comma-separated list, the latter yielding a tuple) and assigns the single resulting object to each of the target lists, from left to right.
该部分还有一个相关的警告适用于这种情况:
WARNING: Although the definition of assignment implies that overlaps between the left-hand side and the right-hand side are ‘safe’ (for example
a, b = b, a
swaps two variables), overlaps within the collection of assigned-to variables are not safe! For instance, the following program prints[0, 2]
:06005
有可能去bar.next_bar = bar = next_bar,这确实产生了最初期望的结果,但是对任何人(包括原作者以后的某个时间!)都很遗憾,他们将不得不稍后阅读这些代码,并为这样的事实感到高兴用我认为蒂姆会用过的话,如果他想到的话,
Explicit is better than a potentially confusing corner-case.
内容总结
以上是互联网集市为您收集整理的python – 为什么分配给多个目标(标识符/属性)会产生奇怪的结果?全部内容,希望文章能够帮你解决python – 为什么分配给多个目标(标识符/属性)会产生奇怪的结果?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。