Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 变量赋值_Python_Variables_Variable Assignment - Fatal编程技术网

Python 变量赋值

Python 变量赋值,python,variables,variable-assignment,Python,Variables,Variable Assignment,我对python中的变量赋值问题感到困惑。我试着在网上找关于,但我还是不明白 假设我给变量赋值: v = 2 Python在某个内存位置保留了一个值为2的位置。现在,我们知道如何通过为特定内存位置分配一个变量名来访问它:v 如果这样,我们会这样做: v = v + 4 一个新的内存位置将用值6(2+4)归档,因此现在要访问这个值,我们将变量v绑定到它 这是正确的,还是完全错误的 内存位置中的初始值2会发生什么变化?它不再绑定到任何变量,因此无法再访问此值?这是否意味着在接下来的几分钟内,该内

我对python中的变量赋值问题感到困惑。我试着在网上找关于,但我还是不明白

假设我给变量赋值:

v = 2
Python在某个内存位置保留了一个值为
2
的位置。现在,我们知道如何通过为特定内存位置分配一个变量名来访问它:
v

如果这样,我们会这样做:

v = v + 4
一个新的内存位置将用值
6
(2+4)归档,因此现在要访问这个值,我们将变量
v
绑定到它

这是正确的,还是完全错误的

内存位置中的初始值
2
会发生什么变化?它不再绑定到任何变量,因此无法再访问此值?这是否意味着在接下来的几分钟内,该内存位置将被垃圾收集器释放

谢谢你的回复

编辑:

v=2
v=v+2
只是简单的例子。在我的例子中,不是2和v+2,而是一个非python本机对象,它的重量可以从几十兆字节到400兆字节。
我很抱歉没有在一开始就澄清这一点。我不知道整数和其他类型的对象之间有什么区别。

就这一点而言,你是对的。实际上,Python构造整数对象24。在第一次赋值中,口译员将v指向2对象

在第二个赋值中,我们构造了一个对象6,并使v指向该对象,正如您所怀疑的那样

接下来会发生什么取决于实现。大多数使用对象表示原子值的解释器和编译器都会将2对象识别为一个小整数,可能会再次使用,而且维护成本非常低,因此不会被收集。通常,代码中出现的文本不会被交给垃圾收集



谢谢你更新这个问题。是的,您的大对象(没有对它的引用)现在可用于GC。

带有小整数(-5到256)的示例不是最好的示例,因为它们是以特殊方式表示的(请参见示例)

你对事物流动的看法通常是正确的,所以如果你有

v = f(v)
发生以下情况:

  • 通过计算
    f(v)
    (对小整数或文字优化进行模化),将创建一个新对象
  • 此新对象绑定到变量
    v
  • 以前在
    v
    中的内容现在无法访问,通常很快就会被垃圾收集

你说的“大多数这种类型的解释器和编译器”是什么意思?问题是关于Python的,据我所知,Python没有垃圾收集器的优点。。。尽管垃圾收集取决于实现。我们有一个可以回收释放的内存;否则,我们的一些大数据应用程序将出现故障。谢谢@Prune和@maxymoo。为什么wikipedia在关于分配的页面上声明以下内容:
Assignment语句。。。将值复制到变量中。
。赋值是否真的将值复制到变量中?或者它实际上只是指向那个值(在内存位置)?这两件事是不同的。以下是链接:
https://en.wikipedia.org/wiki/Assignment_%28computer_science%29
Wikipedia页面是许多编程语言的通用页面。在Python中,复制的值是指向2的指针,而不是2本身。这是语言定义的一个重要细节。在大多数语言中,实际值被复制到变量的内存位置。Python的优点是每个变量的主位置的大小是一个字的内存。谢谢。所以,当Python将指针复制到内存位置中的某个对象时,该对象的大小是无关的?它可以是1kb或1gb,是一样的吗?指针的复制将以相同的速度“完成”?谢谢@aldanor。当不需要使用时,使用
v=v+someValue
是否是一种不良做法?例如,我可以这样写:
v2=v+someValue
。但是,从垃圾收集的角度来看,如果我将右侧的表达式分配给先前定义的变量(
v
,在本例中),即使我不必这样做,是否会更好?除非名称阴影引入不必要的混淆,否则这其实不是一个坏做法(例如,分配给与函数参数名称冲突的名称)。在大多数情况下,这两个示例之间没有区别,因为垃圾收集不会立即发生,而且,很可能在垃圾收集发生时,
v
会以任何一种方式被收集。我个人从未见过这样一个示例,除非您正在处理大量的回收成本高你不应该真的担心。明白了。我认为通过引入
v=v+someValue
我在某种程度上节省了内存空间。现在我发现情况并非如此,而且可能会引起混乱,我不会使用这种语法。感谢@aldanor的帮助。