【问题标题】:Limitations of variables in pythonpython中变量的限制
【发布时间】:2015-03-24 02:31:58
【问题描述】:

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

那么.. 有什么一般规则是我们不能设置为变量的吗? python中的一切都是一个对象,我们可以将变量用于存储字符串、整数、别名变量、列表、调用类引用等的典型标准用法,如果我们很聪明,甚至可以像下面那样做一些事情想想我的头顶,这可能有用的地方

var = lambda: some_function()

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

var = some_value < some_value ...

也就是说,如果我真的想的话,我从来没有遇到过任何我无法存储为变量的东西,并且想知道是否真的有任何限制?

【问题讨论】:

    标签: python class variables python-3.x data-structures


    【解决方案1】:

    您不能将语法结构存储在变量中。例如,你不能这样做

    command = break
    
    while condition:
        if other_condition:
            command
    

    operator = +
    three = 1 operator 2
    

    【讨论】:

      【解决方案2】:

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

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

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

      然而,这是一种间接形式,弥补了 Python 本身缺乏的特性。 ast 无法与(比如)Lisp 宏的随心所欲的灵活性相比。

      【讨论】:

      • 新我的意思是不到半年的经验,我只是还没有开始研究数据结构或算法或语言的一般工作原理,只是试图先学习基础知识。我了解并且还没有听说过该模块,我将不得不看看它
      • @jakekimds:如果您发现任何需要修复的地方,请随时提出修改建议。
      【解决方案3】:

      根据Language Reference,赋值语句的右侧可以是“表达式列表”或“屈服表达式”。表达式列表是一个或多个表达式的逗号分隔列表。你需要通过更多的标记来提出任何具体的东西,但最终你会发现“表达式”是任意数量的对象(文字或变量名,或应用一元运算符的结果,例如not , ~- 到嵌套的 expression_list)由任何二元运算符(例如算术、比较或按位运算符,或逻辑 andor)或三元 a if condition else b 链接在一起。

      您还可以在语言参考的其他部分中指出,“表达式”正是您可以用作函数的参数,或者用作列表解析或生成器的第一部分(for 之前)的东西表达。

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

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

      var = lambda: some_function()
      

      可以写成:

      var = some_function
      

      【讨论】:

        【解决方案4】:

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

        与流行的强类​​型语言不同,Python 中的变量声明不是必需的。你可以在一个变量中放置几乎任何东西,只要你能想出一个名字。此外,除了 Python 中变量的值能够改变之外,类型通常也可以改变。

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

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

        因此,诸如运算符之类的东西(例如+*)不能存储在变量中,因为它们不符合这些基本要求,并且通常您不能存储expressions em> 本身作为变量(除非您将它们包装在 lambda 表达式中)。


        正如Kevin 所提到的,还值得注意的是,可以某种使用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)
        
      • 【讨论】:

        • 您可以排序将运算符存储在变量中(请参阅operator 模块)。但是您无法执行否则会暗示的各种操作。
        • @Kevin 谢谢,这值得注意。介意我编辑它并引用你吗?
        • 在某种程度上,你实际上可以存储表达式:x = lambda: &lt;expression&gt;
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-26
        相关资源
        最近更新 更多