Python语句x = x + 1如何实现? - python

在C语言中,语句x = x + 1将更改为x分配的同一内存中的内容。但是在Python中,由于变量可以具有不同的类型,所以=左侧和右侧的x可以具有不同的类型,这意味着它们可以引用不同的内存。如果是这样,在x将其引用从旧内存更改为新内存之后,可以通过垃圾回收机制回收旧内存。如果是这样,以下代码可能会多次触发垃圾回收过程,因此效率非常低:

for i in range(1000000000)
    i=i+1

我的猜测正确吗?

更新:

我需要更正代码中的错字,以使问题更清楚:

x=0
for i in range(1000000000)
    x=x+1

@SvenMarnach,您的意思是如果未激活垃圾回收,则整数0、1、2,...,999999999(x曾经被称为标签)都存在于内存中?

参考方案

id可用于跟踪对象的内存“分配”。应该谨慎使用它,但是在这里我认为它很有启发性。 id有点像c指针-也就是说,有些与对象在内存中的“位置”有何关系。

In [18]: for i in range(0,1000,100): 
    ...:     print(i,id(i)) 
    ...:     i = i+1 
    ...:     print(i,id(i)) 
    ...:                                                                        
0 10914464
1 10914496
100 10917664
101 10917696
200 10920864
201 10920896
300 140186080959760
301 140185597404720
400 140186080959760
401 140185597404720
...
900 140186080959760
901 140185597404720
In [19]: id(1)                                                                  
Out[19]: 10914496

小整数(<256)被缓存-即整数1,一旦创建就被“重用”。

In [20]: id(202)                                                                
Out[20]: 10920928     # same id as in the loop
In [21]: id(302)                                                                
Out[21]: 140185451618128   # different id
In [22]: id(901)                                                                
Out[22]: 140185597404208
In [23]: id(i)                                                                  
Out[23]: 140185597404720   #  = 901, but different id 

在此循环中,前几次迭代创建或重用小整数。但是似乎在创建更大的整数时会“重用”内存。它可能不是完整的垃圾回收,但是对代码进行了某种优化,以避免不必要的内存使用。

通常,由于Python程序员不关注这些细节。编写干净可靠的Python代码。在此示例中,在循环中修改迭代变量是一种不好的做法(即使只是示例)。

在Python和C++之间传输数据而无需写入Windows和Unix文件 - python

我有预先存在的python和C ++文件,其中python文件定义了许多点,而C ++代码利用其现有库进行了所需的计算。最终产品是C ++代码写入的文件。我正在寻找一种在python中获取2000点列表的方法,将其传递给函数,然后执行所有C ++代码并输出我需要的文件。其他注意事项。这必须是可以在Linux或Windows机器上工作的东西,并且最少安装新插件…

如何锁定终端运行的perl,obj c,c++,python和ruby等脚本的源代码? - python

我想出售我在perl,obj c,c ++,python,ruby,bash,php等中制作的脚本等它们都在终端中运行。 (Linux)如何锁定源代码,以便无需人们访问源代码即可分发我的脚本..?换句话说,如何将在Terminal中运行的程序的源代码锁定,以便人们可以使用该程序(如果该代码已下载到他们的Linux机器上,但他们无法访问实际的源代码)?例:ex…

在Java中,执行“ ++++++++”表达式,编译器未报告任何错误并且可以正确执行? - java

我用eclipse编写了这段代码,用war写过,结果为3d。public static void main(String[] args) { double a = 5d + + + + + +-+3d; System.out.println(a); } 参考方案 您的表情可以改写为(5d) + (+ + + + +-+3d) 其中第一个+是应用于两个操作数的…

Python MySQLdb“错误:已安装Microsoft Visual C++ 14.0” - python

我正在尝试连接到MySql数据库并将其数据用于一些代码,尽管我正在使用pip install mysqlclient 它给我一个错误说明:  “错误:需要Microsoft Visual C ++ 14.0。  Visual C ++生成工具”:  http://landinghub.visualstudio.com/visual-cpp-build-too…

Python GPU资源利用 - python

我有一个Python脚本在某些深度学习模型上运行推理。有什么办法可以找出GPU资源的利用率水平?例如,使用着色器,float16乘法器等。我似乎在网上找不到太多有关这些GPU资源的文档。谢谢! 参考方案 您可以尝试在像Renderdoc这样的GPU分析器中运行pyxthon应用程序。它将分析您的跑步情况。您将能够获得有关已使用资源,已用缓冲区,不同渲染状态上…