为什么在python3里b=a=1是合理表达式,而print(a=1)却不是。a=1为什么没有返回值?
程序员文章站
2022-05-27 12:37:59
...
lisp里每个表达式均有值,而python3里为什么这种很平常的表达式却没有返回值呢?
没有就是没有,返回值的提法也不对,返回值是函数的结果。准确说应该是表达式值。
语言的语法是人定义的,赋值是assignment statement,不是expression,所以没有值。
另外,在python里面function_name(var=????)是有特殊的语义的,它指的是function_name的var参数的实参是????。
例如
python中赋值就是赋值,他不是一个表达式,也就不会返回一个表达式的值。
这样做的一个好处是让语法更加清晰。
在C中存在一个“行内赋值”的问题,举个栗子:你打算判断x的值是否等于1000, 如果等于1000则返回真,如果不等则返回假,正确的代码应该是:
即使有返回值的 Lisp ,返回值一般也是 '(),这就告诉你不要想用返回值做什么事,其实和 Python 的思想是一样的。
区别是 Python 用一个语法错误来防止程序员干蠢事而已。
Why does Python assignment not return a value?
链式赋值的逻辑不是先求值右侧的表达式再赋给左侧,仅仅是一种语法而已。下面可以看到,赋值的语句的解析显然不是递归的。
Simple statements
而是把1赋给b和a
语句就像cpp的"return xxx;"一样 不必要有值
另外表达式的值也不叫返回值 因为Python语言的设计者认为赋值最重要的作用是其副作用,不应该像表达式那样有返回值.详见:https://docs.python.org/3/faq/design.html?highlight=assignment#why-can-t-i-use-an-assignment-in-an-expression
回复内容:
首先,因为你在用C/C++的思维理解python。没有就是没有,返回值的提法也不对,返回值是函数的结果。准确说应该是表达式值。
语言的语法是人定义的,赋值是assignment statement,不是expression,所以没有值。
另外,在python里面function_name(var=????)是有特殊的语义的,它指的是function_name的var参数的实参是????。
例如
def f(x, y):
return str(x) + str(y)
楼上的各位解释的已经很清楚了,总结一下就是:python中赋值就是赋值,他不是一个表达式,也就不会返回一个表达式的值。
这样做的一个好处是让语法更加清晰。
在C中存在一个“行内赋值”的问题,举个栗子:你打算判断x的值是否等于1000, 如果等于1000则返回真,如果不等则返回假,正确的代码应该是:
#include
void main(){
int x = 200;
if(x == 1000)
printf("true");
else
printf("false");
}
你要理解为b=a=1是一个语句,而不是表达式。
In [1]: def foo():
...: a = b = 1
...:
In [2]: from dis import dis
In [3]: dis(foo)
2 0 LOAD_CONST 1 (1)
3 DUP_TOP
4 STORE_FAST 0 (a)
7 STORE_FAST 1 (b)
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
赋值语句没有返回值,所以不是表达式,这是因为赋值语句不需要返回值, Python 既不是 C 也不是 Lisp。即使有返回值的 Lisp ,返回值一般也是 '(),这就告诉你不要想用返回值做什么事,其实和 Python 的思想是一样的。
区别是 Python 用一个语法错误来防止程序员干蠢事而已。
Why does Python assignment not return a value?
链式赋值的逻辑不是先求值右侧的表达式再赋给左侧,仅仅是一种语法而已。下面可以看到,赋值的语句的解析显然不是递归的。
Simple statements
assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression)
为什么在python3里b=a=1是合理表达式
链式赋值只是一种语法结构 他并不是跟cpp一样"把1赋给a 再把a的值赋给b"而是把1赋给b和a
而print(a=1)却不是
这句话的意思是把1赋给print的形参a 而不是像cpp那样“把1赋给局部变量a 再把a的值传进去”a=1为什么没有返回值
a=1在cpp里面是表达式(expression) 在py里面叫语句(statement)语句就像cpp的"return xxx;"一样 不必要有值
另外表达式的值也不叫返回值 因为Python语言的设计者认为赋值最重要的作用是其副作用,不应该像表达式那样有返回值.详见:https://docs.python.org/3/faq/design.html?highlight=assignment#why-can-t-i-use-an-assignment-in-an-expression
- Python的赋值语句是没有返回值的,而且很多语言都没有,这并不是编程语言界的规定或者惯例。
- 你的那个
print(a=1) -------------------------------------------------------------------------- TypeError Traceback (most recent call last)
in ----> 1 print(a=1) TypeError: 'a' is an invalid keyword argument for this function() 相关文章
相关视频
专题推荐
-
独孤九贱-php全栈开发教程
全栈 170W+
主讲:Peter-Zhu 轻松幽默、简短易学,非常适合PHP学习入门
-
玉女心经-web前端开发教程
入门 80W+
主讲:灭绝师太 由浅入深、明快简洁,非常适合前端学习入门
-
天龙八部-实战开发教程
实战 120W+
主讲:西门大官人 思路清晰、严谨规范,适合有一定web编程基础学习
-
独孤九贱-php全栈开发教程
网友评论
文明上网理性发言,请遵守 新闻评论服务协议
我要评论