Python中的变量创建过程

2024-06-02 06:46:27 发布

您现在位置:Python中文网/ 问答频道 /正文

在MicrosoftShell中使用2.7.12

序曲

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

行动

a[0] is b[0] is c[0]
True

这三个列表不是指向内存位置中的相同元素吗?因此,如果一个人被改变了,他会改变吗?你知道吗

第一部分我理解:

c[0] = 8888888
a[0]
8888888

部分我不明白:

b[0] = 9999999
a[0]
1

Tags: 内存true元素列表is指向序曲microsoftshell
3条回答

int是不可变的。这意味着当你重新分配a[0]时,你并没有改变1是什么。相反,你在改变a[0]持有的任何东西。你不会改变成为1意味着什么-你会改变成为a[0]意味着什么。你知道吗

另一方面,如果你这样做:

L = [1,2,3]
a = [L]
b = [L]
a.[0].append(4)

您也会看到反映在b中的变化

Python可以决定共享不可变的存储对象(字符串、整数等)

因为它们是不可变的,所以对用户来说是透明的。它只是节省内存。你知道吗

a[0] is b[0]

可能是真的也可能是假。另一方面

a[0] is c[0]

总是正确的,因为a is c。(和修改a更改c

但是由于list类型是可变的,a不能是b(在这种情况下,Python不允许自己优化存储)。这些是独立的物体。修改a不能更改b。你知道吗

请注意我的“可以是真的也可以是假的”这句话。在python3.4中考虑这个问题

>>> b=1234567890
>>> a=[1234567890]
>>> b is a[0]
False

Python并不费心在ba[0]之间建立链接。长字符串也会发生这种情况(我假设这是一个性能问题,而连续两次找到一个精确的大数字的概率很低?而1有更好的机会在整个课程中重复)

但是,如果这样做,会得到不同的结果:

>>> b=1234567890
>>> a=[b,1,2]
>>> b is a[0]
True

(我不知道为什么,因为它可以根据存储为长整型还是仅仅整型、值或地址等而变化。。。,但是Python肯定有更多关于这里复制的值的信息!)你知道吗

结论是:对于不可变的对象,不要依赖于此。始终使用==。你知道吗

Python中的赋值是通过引用来实现的-它为一个对象创建一个新的引用或别名,而不是复制对象-而且由于eventint是Python中的一个对象-至少(在我的版本中-最多256个),这个规则基本上是有效的。你知道吗

下面的函数id-显示对象引用的示例说明了这一点

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

正如您所看到的,尽管值是相同的,但是为每个新float创建了新对象

相关问题 更多 >