Python与Java中的变量声明如何分配内存?如果没有编译步骤,解释语言如何知道变量需要多少内存?
查找强类型与弱类型。
@rpg711变量声明在弱类型语言中也可以是强制的。即使您可能认为它不像在JavaScript中那样是强制性的,声明一个变量也可以设置其范围。
它可能与解释语言和编译语言有关吗?
@但归根结底,它或多或少只是约定,因为大多数/所有这些语言无论如何都有闭包。
它与解释的、编译的以及输入规则分离。没有任何限制阻止某人创建具有不需要变量声明的强类型的编译语言。纯粹是语言创建者的设计决策。
@为什么不声明变量而使用变量会将作用域直接设置为您第一次使用它的位置,与声明变量相同,无论是声明还是只使用弱类型语言都没有区别。最终可能会出现令人困惑、难以阅读的代码,但在功能上却完全相同。
@rpg711在javascript中,一个不声明它在全局范围内而使用的变量,而不是"您第一次使用它的地方"(这是一个常见的错误源)。
@在python中,我相信变量在赋值时被当作局部变量来处理,这个问题不是关于javascript的(好吧,标记不是):stackoverflow.com/questions/370357/…
我好像问了一个愚蠢的问题:但是,我还是从评论中发现了一些问题。
@死亡,这不是一个愚蠢的问题。不过有点宽泛,你也不太清楚。讨论有点偏离轨道:P这里似乎没有人有明确的答案。
@????S?我猜唯一真正了解的人是那些在口译员身上工作的人,大多数人不需要关心打字的细节,我们只接受强打字和弱打字,深入研究这些变量是如何分配的没有真正的好处,因为我们处理的是高-一种级别语言,在这种语言中,除了类型(有时甚至是类型)以外的所有东西都是从语法/语言中抽象出来的。
@rpg711强与弱类型不是这个问题的答案。Python和Java都被认为是强类型的。参见en.wikipedia.org/wiki/python_28programming_language%29_typi‌&8203;ng和en.wikipedia.org/wiki/java_28programming_language%29。强类型语言和弱类型语言的区别在于如何破坏类型系统。例如,C是一种弱类型的语言,因为您可以在不知道编译器所做的事情的情况下,在void*之间进行强制转换。
在可用之前,变量必须分配一个内存位置,然后初始化——无论是在爪哇、Python,甚至是LOGO。
声明意味着使用特定的代码片段使该变量生成器(以Java为例)
int i;
Person p;
它们是声明的,但没有初始化。它们现在被分配到内存中的一个位置——在某些语言中,这个位置和大小可能会不断变化。但是不管怎样,现在内存中有一些物理位置,运行时环境可以查询这些物理位置来检索变量(或者间接指向它的指针,或者实际位置本身)。
既然它有一个空的"框",那么它必须被填充,也就是说它必须被"初始化":
i = 3;
p = new Person();
号
现在盒子里有些具体的东西。它可以使用了。在初始化之前尝试使用它将在EDCOX1(0)中产生(在爪哇中)。
有些语言要求您声明变量,以便显式地为其分配内存(位置和/或大小)。有些语言为您分配内存。正如对你的问题和这个答案的评论所述,有很多变化。
我认为有人误解了这一点,正如您所说的,python必须声明其变量,而您真正的意思是python必须初始化其变量(否则您将如何使用它们?)
你的两个定义都是错误的。
好吧,到目前为止有两次投票被否决,没有对问题所在提出批评。这是一个非常基本的概念。我想知道什么语言不能做到这一点。
这不是相反的方式吗(例如C)?声明给你内存,初始化把东西放在那里。我没有投反对票:P,但我不确定你的第一句话是否正确。可能只是人们不喜欢你称之为宣言。
@用户2357112:当然,我换了。固定的。
这是对的…python解释器必须对它所处理的变量有一些概念,否则在对变量执行操作时会遇到问题。
更好,但这仍然是"声明"的高度非标准定义。此外,许多语言不向内存中的位置分配变量。例如,在Python中,全局变量的dict条目完全有可能在程序执行过程中更改位置。
@用户2357112:我已经更新了它,以纳入您的评论,但我不认为这一级别的准确性是必要的一个新手问题,如这。
我不认为这是个新手问题。当然,它在初学者中出现,但很难回答:p
我最关心的是"声明"的定义。您使用它来指代一个完全独立于标准用法的概念。变量声明类似于int x;或var x;或Dim x As Integer。它与为变量分配存储无关。例如,如果您在C中声明一个自动变量int x;,则不会为该变量分配存储空间。每次在运行时输入函数时,都会在堆栈上分配该变量的存储,并且该存储每次都可能位于不同的位置。如果你申报一个VLA int x[n]…
它甚至可以每次分配不同的空间量。
@用户2357112:啊。我懂了。我将把它从"声明"更改为"分配物理存储位置"。
@????S??:关于声明和初始化概念的问题本身不是一个新问题。这个问题是。但你是对的。我在这里学到了一些东西。
@用户2357112:我觉得这样更好。谢谢你的帮助。