当前位置: 代码迷 >> python >> 混淆处理
  详细解决方案

混淆处理

热度:60   发布时间:2023-07-16 10:32:40.0

我有以下代码可以正常工作:

a = [1, 2, 3, 4]
b = a

>>> b is a
True

如果我稍加修改,它仍然可以工作:

a = [1, 2, 3, 4]
b = a[2] * 2

>>> b is a[2] * 2
True

现在的问题是:

a = [1, 2, 3, 4]
b = a * 2

>>> b is a * 2
False    

有人可以向我解释为什么当b is a[2] * 2返回True时为什么返回False吗?

a是列表时, a * 2创建一个新的列表实例。 如果您两次调用a * 2 ,则会创建两个新的列表实例-这就是为什么b is a * 2产生False

对于b is a[2] * 2获得True的原因b is a[2] * 2是对CPython的优化,它缓存了小整数。 由于整数在Python中是不可变的,因此获取新实例或缓存的实例实际上并不重要,对于较小的整数,如果再次命中相同的整数,Python将返回缓存的版本。 也试试

>>> a = [1, 2, 300, 4]
>>> b = a[2] * 2
>>> b is a[2] * 2
False

当比较相同的列表是不等价is ,除非它们引用相同的列表。 列表具有相同的值并不意味着它们引用内存中的相同列表。

例如,

>>> a = [1,2,3]
>>> id(a) # memory location list a references
161267628
>>> b = [1,2,3]
>>> id(b) # memory location list b references, a different memory location than list a
161276396
>>> a == b 
True
>>> a is b
False
>>> c = a # by this method of assignment; c points to the same point that a does;
# hence changes to a and changes to c, will change both.
>>> id(c) # memory location that c references; this is the same as where a points.
161267628
>>> a is c
True
>>> c.append(4)
>>> print a
[1, 2, 3, 4]
>>> print b
[1, 2, 3]
>>> print c
[1, 2, 3, 4]
>>> d = a[:] # this just copies the values in a to d.  
>>> id(d)
161277036

这很有意义,因为它们指向不同的内存位置,因为如果您想说不更改b而更改第一个列表(如在a末尾追加4 ),则如果ab指向相同的位置,则不可能记忆。

* 2构造一个新列表,而整数具有自身的标识。

>>> type(a[2] * 2)
<type 'int'>
>>> type(a * 2)
<type 'list'>
  相关解决方案