python 中变量的限制

Limitations of variables in python

我意识到这可能有点宽泛,并且认为这是一个有趣的问题,但我还没有真正找到答案。它可能隐藏在 python 文档中的某个地方,但由于我是 python 的新手,所以还没有全部看完。

所以.. 是否有任何我们不能设置为变量的事物的一般规则? python 中的所有内容都是一个对象,我们可以将变量用于存储字符串、整数、别名变量、列表、调用 类 等的典型标准用法以下几行是我脑海中浮现出来的,只要这可能有用

var = lambda: some_function()

存储比较运算符以清理代码,例如:

var = some_value < some_value ...

因此,话虽这么说,我从来没有遇到过任何我不能存储为变量的东西,如果我真的想的话,我想知道是否真的有任何限制?

您不能在变量中存储句法结构。例如,你不能做

command = break

while condition:
    if other_condition:
        command

operator = +
three = 1 operator 2

您不能真正将 表达式和语句 作为对象存储在 Python 中。

当然,您可以将表达式包装在 lambda 中,也可以将一系列语句包装在代码对象或可调用对象中,但您不能轻易地操作它们。例如,将加法的所有实例更改为乘法并不容易。

在某种程度上,这可以通过 ast 模块解决,该模块提供将 Python 代码解析为抽象语法树的功能。然后您可以操纵树,而不是代码本身,并将其传递给 compile() 以将其转回代码对象。

然而,这是一种间接的形式,弥补了 Python 本身缺乏的功能。 ast 真的无法与(比如说)Lisp 宏的无所不能的灵活性相提并论。

根据定义,变量是可以变化或改变的东西。从广义上讲,变量只不过是在给定程序中引用内存中某个位置的一种方式。另一种理解变量的方法是将变量视为放置信息的容器。

与流行的强类​​型语言不同,不需要 Python 中的变量声明。只要您能为它命名,您几乎可以将任何东西放入变量中。此外,除了 Python 中变量的值可以改变之外,类型通常也可以。

为了解决您的问题,我想说 Python 中变量的限制仅与几个基本的必要属性有关:

  • 一个名字
  • 一个范围
  • 一个值
  • (通常)一种

    因此,运算符(例如 +*)不能存储在变量中,因为它们不满足这些基本要求,通常您不能存储 expressions 本身作为变量(除非您将它们包装在 lambda 表达式中)。


    正如 Kevin, it's also worth noting that it is possible to sort of store an operator in a variable using the operator module 所提到的,但是即使这样做,您也无法执行变量在其他情况下会受到的那种操作,因为实际上您只是在进行赋值。 operator 模块的示例:

    import operator
    operations = {"+": operator.add,
                  "-": operator.sub,}
    
    operator_variable_string= input('Give me an operand:')
    operator_function = operations[operator_variable_string]
    result = operator_function(8, 4)
    
  • 根据 Language Reference,赋值语句的右侧可以是 'expression list' 或 'yield expression'。表达式列表是一个或多个表达式的逗号分隔列表。您需要通过几个更多的标记来遵循这一点才能得出任何具体的东西,但最终您会发现 'expression' 是任意数量的对象(文字或变量名称,或应用一元运算符的结果,例如 not~- 到嵌套的 expression_list),由任何二元运算符(例如算术、比较或按位运算符,或逻辑 andor) 或三元 a if condition else b

    您还可以在语言参考的其他部分注意到,'expression' 正是您可以用作函数参数或第一部分(在 for 之前)的东西列表理解或生成器表达式。

    这个 一个相当宽泛的定义 - 事实上,它等于 "anything Python resolves to an object"。但它确实遗漏了一些东西 - 例如,你不能直接将小于运算符 < 存储在变量中,因为它本身不是一个有效的表达式(它必须在其他两个之间表达式),你必须把它放在一个使用它的函数中。同样,大多数 Python keywords 都不是表达式(True、False 和 None 除外,它们都是某些对象的规范名称)。

    请特别注意,函数也是对象,因此函数的名称(不调用它)是一个有效的表达式。这意味着您的示例:

    var = lambda: some_function()
    

    可以写成:

    var = some_function