In [37]: a = range(1, 6)
In [38]: b = range(1, 6)
In [39]: id(1)
Out[39]: 4298160472
In [40]: id(a[0])
Out[40]: 4298160472
In [41]: id(a)
Out[41]: 4376534696
In [42]: id(b)
Out[42]: 4378531744
In [44]: c = a
In [45]: id(c)
Out[45]: 4376534696
然而,这对浮点不起作用-这是合乎逻辑的,因为浮点和整数的数量是无限的
In [49]: a = .1
In [50]: b = .1
In [51]: id(a)
Out[51]: 4298708040
In [52]: id(b)
Out[52]: 4303248152
int
是不可变的。这意味着当你重新分配a[0]
时,你并没有改变1
是什么。相反,你在改变a[0]
持有的任何东西。你不会改变成为1
意味着什么-你会改变成为a[0]
意味着什么。你知道吗另一方面,如果你这样做:
您也会看到反映在
b
中的变化Python可以决定共享不可变的存储对象(字符串、整数等)
因为它们是不可变的,所以对用户来说是透明的。它只是节省内存。你知道吗
可能是真的也可能是假。另一方面
总是正确的,因为
a is c
。(和修改a
更改c
)但是由于
list
类型是可变的,a
不能是b
(在这种情况下,Python不允许自己优化存储)。这些是独立的物体。修改a
不能更改b
。你知道吗请注意我的“可以是真的也可以是假的”这句话。在python3.4中考虑这个问题
Python并不费心在
b
和a[0]
之间建立链接。长字符串也会发生这种情况(我假设这是一个性能问题,而连续两次找到一个精确的大数字的概率很低?而1
有更好的机会在整个课程中重复)但是,如果这样做,会得到不同的结果:
(我不知道为什么,因为它可以根据存储为长整型还是仅仅整型、值或地址等而变化。。。,但是Python肯定有更多关于这里复制的值的信息!)你知道吗
结论是:对于不可变的对象,不要依赖于此。始终使用
==
。你知道吗Python中的赋值是通过引用来实现的-它为一个对象创建一个新的引用或别名,而不是复制对象-而且由于eventint是Python中的一个对象-至少(在我的版本中-最多256个),这个规则基本上是有效的。你知道吗
下面的函数id-显示对象引用的示例说明了这一点
然而,这对浮点不起作用-这是合乎逻辑的,因为浮点和整数的数量是无限的
正如您所看到的,尽管值是相同的,但是为每个新float创建了新对象
相关问题 更多 >
编程相关推荐