当前位置:  开发笔记 > 编程语言 > 正文

python如何在赋值运算符后赋值

如何解决《python如何在赋值运算符后赋值》经验,为你挑选了1个好方法。

好吧,我确定这是一个非常愚蠢的问题.但是python如何为变量赋值?

假设有一个变量a并赋值a=2.因此python为变量分配一个内存位置,a现在指向包含该值的内存位置2.现在,如果我分配一个变量b=a,变量b也指向与变量相同的位置a.

现在.如果我分配一个变量,c=2它仍指向相同的内存位置,a而不是指向一个新的内存位置.那么,python是如何工作的?它是否首先检查所有先前分配的变量,以检查它们中的任何一个是否共享相同的值,然后为其分配内存位置?

此外,它与列表的工作方式不同.如果我分配a=[2,3]然后b=[2,3]使用该id功能检查他们的内存位置,我会得到两个不同的内存位置.但是c=b给了我相同的位置.有人可以解释正确的工作和原因吗?

编辑: -

基本上我的问题是因为我刚开始学习is运算符,显然True只有当它们指向同一个位置时它才会成立.所以,如果a=1000b=1000 a is bFalse,但a="world" b="world"它也是如此.



1> inspectorG4d..:

我之前遇到过这个问题,并且明白它会让人感到困惑.这里有两个概念:

    一些数据结构是可变的,而另一些则不是

    Python可以解决指针......大部分时间都是如此

所以让我们考虑一个列表的情况(当你使用整数时,你不小心偶然发现了实习和窥视孔优化 - 我稍后会讨论这个问题)

所以让我们创建两个相同的列表(记住列表是可变的)

In [42]: a = [1,2]

In [43]: b = [1,2]

In [44]: id(a) == id(b)
Out[44]: False

In [45]: a is b
Out[45]: False

见,尽管名单是相同的,ab不同的存储位置.现在,这是因为python计算[1,2],将其分配给内存位置,然后调用该位置a(或b).python需要相当长的时间来检查每个分配的内存位置以查看是否[1,2]已经存在,以分配b到相同的内存位置a.
而且更不用说列表是可变的,即您可以执行以下操作:

In [46]: a = [1,2]

In [47]: id(a)
Out[47]: 4421968008

In [48]: a.append(3)

In [49]: a
Out[49]: [1, 2, 3]

In [50]: id(a)
Out[50]: 4421968008

看到了吗?a保持的值已更改,但内存位置未更改.现在,如果将一堆其他变量名分配给同一个内存位置怎么办?!它们也会被改变,这将是语言的一个缺陷.为了解决这个问题,python必须将整个列表复制到一个新的内存位置,只是因为我想改变它的值a

即使是空列表也是如此:

In [51]: a = []

In [52]: b = []

In [53]: a is b
Out[53]: False

In [54]: id(a) == id(b)
Out[54]: False

现在,让我们谈谈我所说的有关指针的内容:

假设你想要两个变量来实际谈论相同的内存位置.然后,您可以将第二个变量分配给第一个变量:

In [55]: a = [1,2,3,4]

In [56]: b = a

In [57]: id(a) == id(b)
Out[57]: True

In [58]: a is b
Out[58]: True

In [59]: a[0]
Out[59]: 1

In [60]: b[0]
Out[60]: 1

In [61]: a
Out[61]: [1, 2, 3, 4]

In [62]: b
Out[62]: [1, 2, 3, 4]

In [63]: a.append(5)

In [64]: a
Out[64]: [1, 2, 3, 4, 5]

In [65]: b
Out[65]: [1, 2, 3, 4, 5]

In [66]: a is b
Out[66]: True

In [67]: id(a) == id(b)
Out[67]: True

In [68]: b.append(6)

In [69]: a
Out[69]: [1, 2, 3, 4, 5, 6]

In [70]: b
Out[70]: [1, 2, 3, 4, 5, 6]

In [71]: a is b
Out[71]: True

In [72]: id(a) == id(b)
Out[72]: True

看看那里发生了什么!a并且b都被分配到相同的内存位置.因此,您对其中的任何更改都将反映在另一个上.

最后,让我们简单谈谈我之前提到过的窥视孔.Python试图节省空间.因此,它在启动时会将一些小东西加载到内存中(例如,小整数).因此,当您将变量分配给一个小整数(如5)时,python不必5在将值分配给内存位置之前进行计算,并为其分配变量名称(与列表中的情况不同) ).因为它已经知道它5是什么,并且它存放在某个内存位置,所以它所做的就是为该内存位置分配一个变量名.但是,对于更大的整数,情况不再是这样:

In [73]: a = 5

In [74]: b = 5

In [75]: id(a) == id(b)
Out[75]: True

In [76]: a is b
Out[76]: True

In [77]: a = 1000000000

In [78]: b = 1000000000

In [79]: id(a) == id(b)
Out[79]: False

In [80]: a is b
Out[80]: False

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有