python - 增强分配操作何时表现为就地操作,何时不表现为?
问题描述
我一直都知道 Python 增强操作总是执行就地操作。但似乎并非适用于所有情况。当我在 上应用增强操作时integers
,它没有到位。
var1 = 1234
print(id(var1))
var1 = var1 + 4321
print(id(var1))
print()
var2 = 5678
print(id(var2))
var2 += 8765
print(id(var2))
输出:
140272195234704
140272195234928
140272195234736
140272195234896
但是当我将它应用于列表时,它就到位了。
var1 = [1, 2]
print(id(var1))
var1 = var1 + [3]
print(id(var1))
print()
var2 = [5, 6]
print(id(var2))
var2 += [7]
print(id(var2))
输出:
140461597772992
140461597413184
140461597412480
140461597412480
我的问题是,它什么时候表现为就地操作,什么时候不表现为?为什么?
解决方案
运行时var1 = var1 + [3]
,Python首先执行右边的操作,然后将其赋值给左边的变量。它使用右侧的值的结果创建一个全新的列表,然后将其分配给左侧。旧列表和新列表不同是有道理的。事实上,如果你跑:
var1 = [1, 2]
var2 = var1
var1 = var1 + [3]
这var2
将具有与var1
第二条指令之后相同的 id,并且var2
在第三条指令之后将继续具有相同的 id,而 id 会var
发生变化。
另一方面,var2 += [7]
这表明可以重复使用相同的空间。在大多数情况下,列表上的 += 确实会重用相同的空间。
推荐阅读
- ruby - 从 ruby 中的 zip 流中剥离字节顺序标记
- phpstorm - PhpStorm 中指定代码的自定义代码格式
- python - 如何只显示一次创建日期
- ruby-on-rails - 为 rails geocoder gem 设置动态 api 键
- jenkins - 如何覆盖詹金斯管道中的代理
- vb6 - 调用 .NET DLL 中的方法时,VB6 中的类型不匹配
- dns - 我需要指向我自己的名称服务器的名称服务器记录吗?
- php - 根据 Woocommerce 购物车和结帐中的最小小计删除特定购物车项目
- python - 获取按天分组的最近几天创建的对象列表
- corda - 遍历分类帐