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),由任何二元运算符(例如算术、比较或按位运算符,或逻辑 and
和or
) 或三元 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
我意识到这可能有点宽泛,并且认为这是一个有趣的问题,但我还没有真正找到答案。它可能隐藏在 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),由任何二元运算符(例如算术、比较或按位运算符,或逻辑 and
和or
) 或三元 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