【发布时间】:2017-07-12 09:15:48
【问题描述】:
这是我学习python的第二天(我知道C++的基础知识和一些OOP。),我对python中的变量有些困惑。
这是我目前对它们的理解:
Python 变量是对对象(可变或不可变)的引用(或指针?)。当我们有类似num = 5 的东西时,不可变对象5 会在内存中的某处创建,名称-对象引用对num 会在某个命名空间中创建。当我们有 a = num 时,不会复制任何内容,但现在两个变量都引用同一个对象,并且 a 被添加到同一个命名空间。
这就是我的书,用 Python 自动化无聊的东西,让我感到困惑。由于是新手书,没有提及对象、命名空间等,并尝试解释如下代码:
>>> spam = 42
>>> cheese = spam
>>> spam = 100
>>> spam
100
>>> cheese
42
它提供的解释与 C++ 书籍中的解释完全相同,因为我们正在处理指向对象的引用/指针,所以我对此并不满意。所以在这种情况下,我猜在第 3 行中,由于整数是不可变的,spam 被分配了一个全新的指针/引用,指向内存中的不同位置,即它最初指向的内存没有被修改.因此,我们有cheese 引用spam 引用的初始对象。这是正确的解释吗?
【问题讨论】:
-
您将
42存储在spam中,现在您将spam存储在奶酪中意味着cheese = 42,之后您将spam替换为100,您没有编辑@987654338 @ 这就是为什么cheese仍然是42。 -
正如乔纳斯在他的回答中指出的那样,不变性在这里是一条红鲱鱼:如果你使用像列表这样的可变对象,你会得到完全相同的结果。关键是您将变量重新分配到一个新的引用。
-
@mini:我更喜欢将 Python 变量视为标签而不是存储桶。您将标签
spam贴在数字42 上。接下来,您将标签cheese贴在标记为spam的东西上(请注意,不是在标签本身的顶部)。然后你把spam标签从上面撕下来,放在数字100上。