好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

为什么在python3里b=a=1是合理表达式,而print(a=1)却不是。a=1为什么没有返回值

lisp里每个表达式均有值,而python3里为什么这种很平常的表达式却没有返回值呢?

回复内容: 首先,因为你在用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/d esign.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 
  

  if  (   x   =   1   )   {   #do.... }  
  

查看更多关于为什么在python3里b=a=1是合理表达式,而print(a=1)却不是。a=1为什么没有返回值的详细内容...

  阅读:46次

CopyRight:2016-2025好得很程序员自学网 备案ICP:湘ICP备09009000号-16 http://haodehen.cn
本站资讯不构成任何建议,仅限于个人分享,参考须谨慎!
本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。

网站内容来源于网络分享,如有侵权发邮箱到:kenbest@126.com,收到邮件我们会即时下线处理。
网站框架支持:HDHCMS   51LA统计 百度统计
Copyright © 2018-2025 「好得很程序员自学网
[ SiteMap ]