当前位置: 首页 > 面试题库 >

变量是名称,值还是存储位置?

董康平
2023-03-14
问题内容

我已经学习Python几个月了,对C语言的了解也很少,我想知道是否有人可以帮我解决这个疑问:

变量是名称,值还是存储位置?

例如:

x = 5

变量x,x的值还是x在内存中的位置?

我正在寻找关于什么是变量的清晰解释。我已经看过Wikipedia上有关变量和此问题的页面,但对我来说都不是很清楚。如果这是一个重复的问题,那么指向正确答案的链接将非常有用。

谢谢!


问题答案:

语句发生了几件事x=5

  1. 5创建了一个值为的int对象(或找到它是否已经存在);
  2. 名称x已创建(或与最后标记的对象“ x”无关);
  3. 对新的(或找到的)int对象的引用计数增加1;
  4. 该名称x与创建(或找到)值为“ 5”的对象相关联。

由于int对象是不可变的,因此可以为效率而对它们进行实习。字符串对象更有可能被阻止。

这里有些例子:

>>> x=5    # discussed
>>> id(x)  # the 'id' which in cPython is the memory address.
140246146681256
>>> y=x    # now two names, 'x' and 'y' associated with that object
>>> id(y)  
140246146681256     # same object
>>> z=5    # no guaranteed, likely the same object referred to by 'x' and 'y'
>>> id(z)
140246146681256     # id is the same! The object labeled 'x' was found and labeled 'z'
>>> del x           # ref count to object '140246146681256' decreased by 1
>>> del y           # same
>>> z
5
>>> id(z)
140246146681256    # same object but the names ''x' and 'y' no longer label it

想到变量名称(如“ x”)的最佳方法x=5是作为标签

可能有没有标签的对象,例如在此列表理解中创建的5个单独的字符串对象:

>>> li=[str(x) for x in range(5)]  
>>> li
['0', '1', '2', '3', '4']

然后,您可以创建与这些5个对象的值分别匹配的对象:

>>> li2=list('012345')    # longer list; completely different construction
>>> li2
['0', '1', '2', '3', '4', '5']

您可以获取它们各自的内存地址(在cPython中)或唯一的ID地址:

>>> [id(x) for x in li]
[4373138488, 4372558792, 4372696960, 4373139288, 4373139368]
>>> [id(x) for x in li2]
[4373138488, 4372558792, 4372696960, 4373139288, 4373139368,  4372696720]

请注意,两个独立创建的匿名对象列表是相同的(在本例中为前5个)。我故意使用字符串,因为它们更有可能被插入…

因此,请这样考虑:两个不同的过程正在发生x=5

  1. 对象被创建(或被发现是否是不可变的,被检查的并存在),并且
  2. 该对象被标记。


 类似资料:
  • 问题内容: 场景是我需要至少两次访问一个值。即我正在使用记录器来跟踪应用程序中正在发生的事情。我想记录该函数正在运行的对象的名称,然后再执行具有相同名称的操作(即检查它是否包含一些字符串或将其放入数组中)。 将名称存储在变量中: 或两次调用getName(): 我了解,在第一种情况下,我将创建一个新的String,为其分配一个值,然后两次检索该值。这样,我正在使用更多的内存资源,对吗? 在第二种情

  • 问题内容: 静态变量是在程序执行的整个过程中分配的,因此堆栈和堆都不方便。那在哪呢 应该在某个地方加载它吗? 问题答案: 静态字段在加载类时被初始化,并且在卸载该类的类加载器时被丢弃。它们可以被清理,甚至可以在另一个类加载器中复制。 对于使用OSGi的此类应用程序,静态变量在整个应用程序生命周期中都不会存在,因此可以多次重装。 实现方式可能取决于JVM,但Sun / Oracle JVM创建一个“

  • 问题内容: PHP变量是通过值还是通过引用传递? 问题答案: 根据PHP文档的价值。 默认情况下,函数参数是按值传递的(因此,如果函数中参数的值发生更改,则不会在函数外部进行更改)。要允许函数修改其参数,必须通过引用将其传递。 有一个参数总是通过引用传递函数,在前面加上符号( & ),以在函数定义的参数名称。

  • 我正在尝试将Spark Scala脚本(用编写)转换为Scala类、对象、方法(def)等。因此我为创建JAR。我使用Spark SQL进行了很多调用,它执行了很多关于时区的时间戳计算。我必须显式地设置以下配置(因为每个分布式节点可能配置了不同的默认时区),以确保我的时区对于该方法中任何Spark SQL函数调用(代码块)进行的任何后续Spark SQL时间戳操作始终为UTC。 该方法签名是否应该

  • 建议使用Python记录变量的方法是什么?为什么更好? 旧式插值: 或 新样式<代码>。format() 我听说插值是首选,因为它只在字符串要打印时才计算字符串,但我还没有验证它是否真的重要。