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
- 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.... }
-