為什麼在python3裡b=a=1是合理運算式,而print(a=1)卻不是。a=1為什麼沒有傳回值?

來源:互聯網
上載者:User
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則返回真,如果不等則返回假,正確的代碼應該是:
#includevoid 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 disIn [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
  1. Python的指派陳述式是沒有傳回值的,而且很多語言都沒有,這並不是程式設計語言界的規定或者慣例。
  2. 你的那個
    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.... } 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.