Table of Contents
为什么在python3里b=a=1是合理表达式,而print(a=1)却不是。a=1为什么没有返回值?
Jun 06, 2016 pm 04:23 PM
lisp
python3
lisp里每个表达式均有值,而python3里为什么这种很平常的表达式却没有返回值呢?
回复内容:
首先,因为你在用C/C++的思维理解python。没有就是没有,返回值的提法也不对,返回值是函数的结果。准确说应该是表达式值。
语言的语法是人定义的,赋值是assignment statement,不是expression,所以没有值。
另外,在python里面function_name(var=????)是有特殊的语义的,它指的是function_name的var参数的实参是????。
例如
<span class="k">def</span> <span class="nf">f</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span> <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">y</span><span class="p">)</span>
Copy after login
python中赋值就是赋值,他不是一个表达式,也就不会返回一个表达式的值。
这样做的一个好处是让语法更加清晰。
在C中存在一个“行内赋值”的问题,举个栗子:你打算判断x的值是否等于1000, 如果等于1000则返回真,如果不等则返回假,正确的代码应该是:
<span class="cp">#include<stdio.h></span> <span class="kt">void</span> <span class="nf">main</span><span class="p">(){</span> <span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">200</span><span class="p">;</span> <span class="k">if</span><span class="p">(</span><span class="n">x</span> <span class="o">==</span> <span class="mi">1000</span><span class="p">)</span> <span class="n">printf</span><span class="p">(</span><span class="s">"true"</span><span class="p">);</span> <span class="k">else</span> <span class="n">printf</span><span class="p">(</span><span class="s">"false"</span><span class="p">);</span> <span class="p">}</span>
Copy after login
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
Copy after login
即使有返回值的 Lisp ,返回值一般也是 '(),这就告诉你不要想用返回值做什么事,其实和 Python 的思想是一样的。
区别是 Python 用一个语法错误来防止程序员干蠢事而已。
Why does Python assignment not return a value?
链式赋值的逻辑不是先求值右侧的表达式再赋给左侧,仅仅是一种语法而已。下面可以看到,赋值的语句的解析显然不是递归的。
Simple statements
assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression)
Copy after login
为什么在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的赋值语句是没有返回值的,而且很多语言都没有,这并不是编程语言界的规定或者惯例。
- 你的那个
<span class="x">print(a=1)</span> <span class="x">--------------------------------------------------------------------------</span> <span class="x">TypeError Traceback (most recent call last)</span> <span class="x"><ipython-input-4-ab52a41c9aa5> in <module>()</span> <span class="x">----> 1 print(a=1)</span> <span class="x">TypeError: 'a' is an invalid keyword argument for this function</span>
Copy after login<span class="k">if</span><span class="p">(</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">1</span> <span class="p">)</span> <span class="p">{</span> <span class="c">#do.... } </span>
Copy after login
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot Article
Repo: How To Revive Teammates
3 weeks ago
By 尊渡假赌尊渡假赌尊渡假赌
How Long Does It Take To Beat Split Fiction?
3 weeks ago
By DDD
R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
1 weeks ago
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
3 weeks ago
By 尊渡假赌尊渡假赌尊渡假赌

Hot tools Tags

Hot Article
Repo: How To Revive Teammates
3 weeks ago
By 尊渡假赌尊渡假赌尊渡假赌
How Long Does It Take To Beat Split Fiction?
3 weeks ago
By DDD
R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
1 weeks ago
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
3 weeks ago
By 尊渡假赌尊渡假赌尊渡假赌

Hot Article Tags

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

How Do I Use Beautiful Soup to Parse HTML?

How to Use Python to Find the Zipf Distribution of a Text File

How to Work With PDF Documents Using Python

How to Cache Using Redis in Django Applications

How to Perform Deep Learning with TensorFlow or PyTorch?

Serialization and Deserialization of Python Objects: Part 1

How to Implement Your Own Data Structure in Python
